条件测试语法:

        在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过与if等条件语句相结合,让我们可以方便的按成判断。

格式1:test<测试表达式>

格式2:[<测试表达式>]

格式3:[[<测试表达式>]]

说明:

格式1和格式2是等价的

格式3为扩展的test命令,有网友推荐用格式3

提示:

在[[]]中可以使用通配符进行模式匹配。&&,||,>,<等操作符可以应用于[[]]中,但不能应用[]中。

对整数进行关系运算,也可以使用shell的算术运算符(())

语法例子:

格式1:test<测试表达式>

范例1:test测试文件

[root@XCN ~]# test -f file&& echo 1||echo 0  
0
[root@XCN ~]# test -f file && echo true||echo false
false

范例2:test命令非(!)的写法

[root@XCN ~]# test ! -f file && echo true||echo false
true
[root@XCN ~]# touch file
[root@XCN ~]# test ! -f file && echo true||echo false
false


格式2:[<测试表达式>]

范例[]

[root@XCN ~]# rm -f file 
[root@XCN ~]# [ -f file ]&& echo 1||echo 0
0
[root@XCN ~]# touch file 
[root@XCN ~]# [ -f file ]&& echo 1||echo 0
1
[root@XCN ~]# [ ! -f file ]&& echo 1||echo 0
0
[root@XCN ~]# rm file 
rm: remove regular empty file `file'? y
[root@XCN ~]# [ ! -f file ]&& echo 1||echo 0
1

格式3:[[<测试表达式>]]

[root@XCN ~]# [[ -f file ]]&& echo 1||echo 0
0
[root@XCN ~]# touch file
[root@XCN ~]# [[ -f file ]]&& echo 1||echo 0
1


文件测试操作符

常用文件测试操作符号说明
-f 文件 file若文件存在且为普通文件则真
-d 文件 directory若文件存在且为目录文件则真
-s 文件 size若文件存在且不为空(文件大小非0则真)
-e 文件exist若文件存在则真,要区别-f
-r 文件 read若文件存在且可读则真
-w  文件 write若文件存在且写则真
-x   文件 excute若文件存在且可执行则真
-L   文件  link若文件存在且为链接文件则真
f1 -nt f2 newer than若文件f1比文件f2新则真
f1 -ot f2 older than若文件f1比文件f2旧则真


举例:

[root@XCN 03]# touch xcn
[root@XCN 03]# [ -f xcn ] && echo 1 ||echo 0     #-f  文件存在
1
[root@XCN 03]# [ -d xcn ] && echo 1 ||echo 0      #-d  目录
0
[root@XCN 03]# [ -e xcn ] && echo 1 ||echo 0      #-e  不管什么存在则会真
1
[root@XCN 03]# [ -d tom ] && echo 1|| echo 0
1
[root@XCN 03]# [ -s xcn ] && echo 1||echo 0      #-s  针对文件的
0


字符串测试操作符

        字符串测试操作符的作用:比较两个字符串是否相同,字符串长度是否为零,字符串是否为NULL(注:bash分区零长度字符串和空字符串)等。

        "="比较两个字符串是否相同,与=等价,如if[ "$a"="$b" ],其中$a这样的变量最好用""括起来,因为如果中间有空格,*等符号就可能出错了,当然更好的方法就是["${a}"="${b}"]."!="比较两个字符串是否相同,不同则为"是"

常用字符串测试操作符说明
-z "字符串"若串长度为0则真,-z可以理解为zero
-n "字符串"若串长度不为0则真,-n可以理解为no zero
"串 1"="串2"若串1等于串2则真,可使用"=="代替"="
"串 1"!="串2"若串1不等于串2则真。但不能用"!=="代替"!="

字符串测试操作符提示:

1)-n比较字符串长度是否不为零,如果不为零则为真,如:[-n "$myvar"]

2)-z比较字符串长度是否等于零,如果等于零则为真,如:[-z "$myvar"]

特别注意,对于以上表格中的字符串测试操作符号,如[-n "$myvar"],要把字符串用''引起来

[root@XCN ~]# [ -n "test" ] && echo 1|| echo 0
1
[root@XCN ~]# [ "abc" == "abs" ] && echo 1||echo 0
0
[root@XCN ~]# [ "abc" == "abc" ] && echo 1||echo 0 
1
[root@XCN ~]# [ "abc" != "abc" ] && echo 1||echo 0 
0


整数二元比较操作符:

在[]中使用的比较符在(())和[[]]中使用的比较符说明
-eq==equal的缩写,相等
-ne!=not equal的缩写,不相等
-gt>大于greater than
-ge>=大于等于greater equal
-lt<小于类似less than
-le<=小于等于less equal

提示:

1)"<"符号意思是大于,if[["$a"<"$b"]],if["$a"\<"$b"].在单[]中需要转义,因为shell也用<和>重定向。

2)“>”符号意思是大于,if [["a">"$b"]]   if["$a"\>"$b"]在单[]中需要转义,因为shell也用<和>重定向

3)"="符号意思是等于,if[["$a"="$b"]]  if["$a"="$b"]在单[]中不需要转义

特别提示:

        经过实战,"="和"!="在[]中使用不需要转义,包含">"和"<"的符号在[]中使用需要转义,对于数据不转义的结果未必会报错,但是结果可能不会对

范例1:二元数字比较

[root@XCN ~]# [ 12 -eq 13 ]&& echo 1||echo 0
0
[root@XCN ~]# [ 12 -gt 13 ]&& echo 1||echo 0  [root@XCN ~]# [ 12 \< 13 ]&& echo 1||echo 0   
1
[root@XCN ~]# [ 12 \> 13 ]&& echo 1||echo 0   
0
0
[root@XCN ~]# [ 12 -lt 13 ]&& echo 1||echo 0 
1
[root@XCN ~]# [ 12 = 13 ]&& echo 1||echo 0  
0



逻辑操作符

在[]中使用的逻辑操作符在[[]]中使用的逻辑操作符说明
-a&&and与,两端都为真,则真
-o||or或,两端有一个为真则真
!!not非,相反则为真

提示:

!    中文意思是反:与一个逻辑值相反的逻辑值

-a   中文意思是与(and &&):两个逻辑值都为"真",返回值才为"真"反之为"假"

-o   中文意思是或(or):两个逻辑值只要有一个为"真",返回值就为"真"

[root@XCN ~]# n1=12;n2=13
[root@XCN ~]# [[ $n1 -eq $n2 && -z "$1" ]]&&echo 1||echo 0
0


test命令测试:

[root@XCN ~]# test -f $f1|echo 1|echo 0
0
[root@XCN ~]# test -f "$f1"|echo 1|echo 0
0
[root@XCN ~]# test -z "$f1"|echo 1|echo 0 
0
[root@XCN ~]# test -z $f1|echo 1|echo 0  
0


小结:逻辑操作符使用总结

[]中用-a,-o

[[]]中用&&,-o,!

test用法和[]相同