一般用于作简单的判断,语法有下列三种
格式1:test -参数 <测试表达式>
格式2:[<测试表达式>]
格式3:[[<测试表达式>]]
格式1和格式2是一样的。
格式3为扩展的test命令
提示:
在[[]]中可以使用通配符进行模式匹配。&&、||、<>等操作符可以应用于[[]]中,但不可以应用于[]中
下面是例子:
[root@zhouyu ~]# test -f file && echo 1||echo 0
0
上面的语法的意思就是说看看有没有这个文件,如果有就输出1如果没有就输出0,如果你想要相反的,可以在test后面加上感叹号!,这个意思就是说如果没有这个文件就输出1如果有就输出0,同样的,我们可以用第二各方法来测试,它们是一样的,而第三各比较特殊,它是扩展的。
[root@zhouyu ~]# [ -f file ] && echo 1 ||echo 0
0
如果你想要判断的语句要两个都存在的话,那么可以用第一或第二种方法,可是会比较麻烦,因为你要判断第一个文件存在不,如果存在你就要判断第二个文件存在不,可是如果你用第三种方法的话就不一样,你可以输入下列命令来判断
[root@zhouyu shell]# [[ -f filw && -d folder ]] && echo 1||echo 0
0
如果你想要了解[]中有什么参数可以用的话,可以用man bash命令去查看。
输入man bash然后在这个模式下输入/\-f,按enter,然后一直按n直到看到下图:
下面是一些常用的
字符串测试操作符的作用:比较两个字符串是否相同,字符串的长度是否为零,字符串是否为null等。
“=”比较两个字符串是否相同,与“==”等价
下面是常用的字符串
注意:上面的字符串测试操作符号要用""保护起来,除了比较的,比如两个变量比较大小的。
如:[ -n "$myvar" ],$myvar一定要用""保护起来,不然出来的结果可能不是你想要的。
下面是两个整数比较的比较符
所以本人建议是用第三种,扩展的
[root@zhouyu shell]# [ 1 -ne 0 ] && echo 1||echo 0
1
[root@zhouyu shell]# [ 1 -eq 0 ] && echo 1||echo 0
0
[root@zhouyu shell]# [ 1 -gt 0 ] && echo 1||echo 0
1
[root@zhouyu shell]# [ 1 -lt 0 ] && echo 1||echo 0
0
[root@zhouyu shell]# [ 1 -ge 0 ] && echo 1||echo 0
1
[root@zhouyu shell]# [ 1 -le 0 ] && echo 1||echo 0
0
下面是逻辑操作符
如果是-a的话,只有两边都为真才是对的,不然就是错的
-o是只要有一边为真就是真的
如图
[root@zhouyu shell]# file1=/etc/hosts;file2=/etc/sysconfig/network
[root@zhouyu shell]# [ -f "$file1" -a -e "$file2" ] && echo 1||echo 0
1
[root@zhouyu shell]# [ -f "$file1" -o -e "$file2" ] && echo 1||echo 0
1
[root@zhouyu shell]# [ -f "$file1" -a -f "$file3" ] && echo 1||echo 0
0
这里可能有同学想问了,我想让[]内的去判断,如果错了 我就执行后面三条命令,如果对了 就不执行,怎么办呢,下面我们来做实验
[root@zhouyu shell]# [ -f "$file2" ] || echo 1;echo 0;echo 2
0
2
[root@zhouyu shell]# [ -f "$file3" ] || echo 1;echo 0;echo 2
1
0
2
由上面可知,不管我们的判断对不对,都会执行echo 0和echo 2,可是我们的目的是如果对我们就不执行,不对我们就一次性执行三个命令,其实可以用下面这个方法
[root@zhouyu shell]# [ -f "$file3" ] || { echo 1;echo 0;echo 2
> }
1
0
2
[root@zhouyu shell]# [ -f "$file2" ] || { echo 1;echo 0;echo 2
> }
[root@zhouyu shell]# [ -n "$file3" ] && echo 1 || echo 0
0
[root@zhouyu shell]# [ -z "$file3" ] && echo 1 || echo 0
1
特别强调,对于变量一定要加""号。
[root@zhouyu shell]# [ "$file3" = "$file4" ] && echo 1 || echo 0
1
记住了,它们中间一定要有空格,不然可能会出错,如下
[root@zhouyu shell]# echo $file1 $file2
/etc/hosts /etc/sysconfig/network
[root@zhouyu shell]# [ "$file1" == "$file2" ] && echo 1 || echo 0
0
[root@zhouyu shell]# [ "$file1"=="$file2" ] && echo 1 || echo 0
1
下面是比较两个参数的长度是否相等
[root@zhouyu shell]# [ "${#file1}" = "${#file2}" ] && echo 1 || echo 0
0
下面比较两个参数的字符串是否相等
[root@zhouyu shell]# [ "${file1}" = "${file2}" ] && echo 1 || echo 0
0