条件判断式,说白了一个条件是否成立。测试语句不是给用户来判断,而是让计算机来判断的
1、按照文件类型进行判断
其中最常用的测试选项是:-d 文件、-e 文件、-f 文件。
1.1> 两种判断格式:
-
[root@localhost ~]# test -e /root/install.log
-
[root@localhost ~]# [ -e /root/install.log ]
注意:
(1)其中两种判断格式都一样的。但是,第二种[ ]中括号和-e之间有空格,这种格式嘴上用在Shell脚本中。
(2)这种判断文件是否存在的格式,是给程序使用的,目的是为了写脚本。
(3)命令:echo $? —— > 输出上一条命令是否正确,正确输出0,错误输出1。
示例如下:
[root@root ~]# ls
anaconda-ks.cfg install.log.syslog 公共的 视频 文档 音乐
install.log student.txt 模板 图片 下载 桌面
[root@root ~]# test -e student.txt
[root@root ~]# echo $?
0
[root@root ~]# test -e student.txtdddd
[root@root ~]# echo $?
1
[root@root ~]# [ -e student.txt ]
[root@root ~]# echo $?
0
[root@root ~]# [ -e student.txtkkkk ]
[root@root ~]# echo $?
1
1.2 > 通过逻辑与(&&)和逻辑或(||)判断是否存在
每次通过前面两个命令判断完,还需要通过[echo $?]命令输出判断结果,很是麻烦,因此我们尅通过以下命令:
- [ -d /root] && echo “yes” || echo “no”
#第一个判断命令如果正确执行,则打印 “yes” ,否则打印 “ no ”
#逻辑与(&&),当第一条命令正确执行,第二条命令才会执行;逻辑或(||),当第一条命令不正确执行,第二条命令才会执行
示例如下:
[root@root ~]# [ -f /root/student.txt ] && echo "yes" || echo "no"
yes
[root@root ~]# [ -f /root ] && echo "yes" || echo "no"
no
2、按照文件权限进行判断
其中最常用的测试选项是:-r 文件、-w 文件、-x 文件。
2.1> 命令格式如下:
- [ -w student.txt ] && echo “yes” || echo “no”
#判断文件是否拥有写权限
示例如下:
[root@root ~]# ll
总用量 104
-rw-------. 1 root root 1498 6月 22 19:26 anaconda-ks.cfg
-rw-r--r--. 1 root root 47922 6月 22 19:26 install.log
-rw-r--r--. 1 root root 10033 6月 22 19:23 install.log.syslog
-rw-r--r--. 1 root root 111 7月 14 17:21 student.txt
drwxr-xr-x. 2 root root 4096 6月 22 19:30 公共的
drwxr-xr-x. 2 root root 4096 6月 22 19:30 模板
drwxr-xr-x. 2 root root 4096 6月 22 19:30 视频
drwxr-xr-x. 2 root root 4096 6月 22 19:30 图片
drwxr-xr-x. 2 root root 4096 6月 22 19:30 文档
drwxr-xr-x. 2 root root 4096 6月 22 19:30 下载
drwxr-xr-x. 2 root root 4096 6月 22 19:30 音乐
drwxr-xr-x. 3 root root 4096 7月 13 14:00 桌面
[root@root ~]# [ -w /root/student.txt ] && echo yes || echo no
yes
#用这种方式测试,就没有我们用肉眼看那么准确了。
#不管所有者,所属组,其他人,只要这个三个身份中有一个人有写权限,它的返回值就为yes。
#它不会区分那么细。
3、两个文件之间进行比较
注意:
- 所谓的Inode号,就是i结点号。每一个文件都有它自己的Inode号,可以看做是文件的ID号。如果文件1和文件2作了硬链接,它们两个的区别是两个文件的文件名可以随便改,只有通过判断它们两个的Inode号,是否为同一个文件。
- 软连接有自己的标志,而硬链接没有。
3.1 > 示例说明:
ln /root/student.txt /tmp/stu.txt
#创建和硬链接
[ /root/student.txt -ef /tmp/stu.txt ] && echo yes || echo no
#用test测试一下,果然很有用
- 示例(1):
[root@root ~]# ll /etc
... ...
lrwxrwxrwx. 1 root root 56 6月 22 19:16 favicon.png -> /usr/share/icons/hi
... ...
#软连接有箭头(—>)表示他的源文件在啥地方
[root@root ~]# ll
总用量 104
-rw-------. 1 root root 1498 6月 22 19:26 anaconda-ks.cfg
-rw-r--r--. 1 root root 47922 6月 22 19:26 install.log
-rw-r--r--. 1 root root 10033 6月 22 19:23 install.log.syslog
-rw-r--r--. 1 root root 111 7月 14 17:21 student.txt
[root@root ~]# ln /root/student.txt /tmp/stu.txt
#将/root下的student.txt硬连接为/tmp成stu.txt的文件
[root@root ~]# ll -i /root/student.txt
273719 -rw-r--r--. 2 root root 111 7月 14 17:21 /root/student.txt
[root@root ~]# ll -i /tmp/stu.txt
273719 -rw-r--r--. 2 root root 111 7月 14 17:21 /tmp/stu.txt
#只有通过-i选项,查看它们的I结点号是否相同,进行判断,这是通过人肉眼来看的。
#所以想让计算机判断只能通过:-ef 来判断
- 示例(2):
通过-ef选项,判断是否为硬链接。
[root@root ~]# [ /root/student.txt -ef /tmp/stu.txt ] && echo yes || echo no
yes
You have new mail in /var/spool/mail/root
[root@root ~]#
4、两个整数之间比较
示例说明:
[root@root ~]# [ 23 -gt 22 ] && echo yes || echo no
yes
[root@root ~]# [ 23 -gt 23 ] && echo yes || echo no
no
[root@root ~]# [ 23 -ge 23 ] && echo yes || echo no
yes
[root@root ~]# [ 23 -ge 40 ] && echo yes || echo no
no
5、字串的判断
5.1> 判断字串是否为空:
name=sc
#给name变量赋值
[ -z “$name” ] && echo “yes” || echo “no”
#判断name变量是否为空,因为不为空,所以返回no
示例如下:
[root@root ~]# name=sc
[root@root ~]# [ -z "$name" ] && echo "yes" || echo "no"
no
[root@root ~]# [ -z "$namebo" ] && echo "yes" || echo "no"
yes
- 通过以上这个方法判断变量是否有值,在程序当中非常重要。
- 在程序当中,我们常常要求用户输入一个值,比如年龄,在通过年龄进行一系列的计算。但是,我们有些用户啥也不输,直接回车,这个时候我们就先要进行判断一下有没有值,如果没有值程序就直接终止了,后续程序就不用执行了,免得程序出现bagel。
5.2> 判断两个值是否相等
aa=11
bb=22
#给变量aa和变量bb赋值
[ “$aa”=="$bb" ] && echo “yes” || echo “no”
#判断两个变量的值是否相等,明显不相等,所以返回no
注意:
- 这里的“==”号,是把aa和bb当做字串来判断。而-eq是当做数值来判断,当做整型来判断。我们更习惯于用“==”号进行判断。也可以使用“=”号,但是我们推荐使用“==”号。
6、多重条件判断
6.1 > 示例
aa=11
[ -n “$aa” -a “$aa” -gt 23 ] && echo “yes” || echo “no”
#判断变量aa是否有值,同时判断变量aa的值是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也为假
示例如下:
[root@root ~]# aa=24
[root@root ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo yes || echo no
yes
[root@root ~]# [ -n "$aa" -a "$aa" -gt 27 ] && echo yes || echo no
no
[root@root ~]# [ -z "$aa" -a "$aa" -gt 27 ] && echo yes || echo no
no
[root@root ~]#