通常情況下,執行條件測試表達式會返回“真”或“假”,如果可以根據這些條件測試進行判斷。
語法:
1)test 表達式
2)[ 測試表達式 ] 推薦的一種
3) [[ 測試表達式 ]]
4) (( 測試表達式 ))
注意:
1)[[ ]](雙中括號)中可以使用通配符進行模式匹配 ,&& || > <操作符可以應用到[[ ]]
2) -a -o -gt -lt -eq -le等一般用在單中括號里
3)對于整數的關系運算,一樣用(( ))
案例1:
[root@fenfa day04]# test -f /tmp/yuki.txt || mkdir /tmp/yuki.txt
[root@fenfa day04]# char=" "
[root@fenfa day04]# test -z "$char" && echo 1 || echo 0
0
案例2: 【】的使用
[root@fenfa day04]# [ -f /tmp/yuki01 ] || touch /tmp/yuki01
[root@fenfa day04]# [ -f /tmp/yuki01 ] && echo True || echo False
True
&& : 表達式前面為真,就執行后面的,如果為假,就不執行后面的
|| : 表達式前面為假,就執行后面的,如果為真,就不執行后面的

二) 文件測試操作符
-f 文件 判斷文件是否存在
-d目錄 判斷目錄是否存在
-l 文件 判斷文件是否為鏈接文件
-r 文件 判斷文件是否可讀
-w 文件 判斷文件是否可寫
-x文件 判斷文件是否可執行
(執行腳本的用戶,對這個文件,是否可讀、寫、執行)
-s文件 判斷文件大小是否為0 不為0為真
案例:
[root@fenfa tmp]# touch yuki02.txt
[root@fenfa tmp]# [ -f /tmp/yuki02.txt ] && echo True || echo False
True
判斷文件是否存在,存在則輸出為true,不存在為false
[root@fenfa tmp]# mkdir louis
You have mail in /var/spool/mail/root
[root@fenfa tmp]# [ -f louis ] && echo 1 || echo 0
0
(因為剛剛創建的是目錄,這個-f判斷是文件)
[root@fenfa tmp]# [ -d /tmp/louis ] && echo 1 || echo 0
1
[root@fenfa tmp]# ll -l yuki02.txt
-rw-r--r-- 1 root root 0 Jan 25 00:12 yuki02.txt
(權限: rw r r)
[root@fenfa tmp]# [ -r /tmp/yuki02.txt ] && echo 1 || echo 0
1
(root可以運行,可讀)
You have mail in /var/spool/mail/root
[root@fenfa tmp]# [ -w /tmp/yuki02.txt ] && echo 1 || echo 0
1
(root用戶運行,可寫)
[root@fenfa tmp]# su - www
welcome 1000,you home is /home/www,please don't delete file
[www@fenfa ~]$ [ -w /tmp/yuki02.txt ] && echo 1 || echo 0
0
(其他用戶,www用戶執行腳本,就沒有寫權限)
[www@fenfa ~]$ exit
logout
[root@fenfa tmp]# [ -x /tmp/yuki02.txt ] && echo 1 || echo 0
0
(root用戶沒有執行權限)
(說明: 運行腳本的用戶,對這個文件是否有讀寫執行權限)
當表達式成立,也可以執行多個語句
[ 測試表達式 ] && {
語句1
語句2
語句3
.....
}
三)字符串操作符
功能:
1)比較2個字符串是否相同
2)測試字符串長度是否為0
-z “字符串” 字符串長度是否為空(0),空者為真
-n “字符串” 字符串長度是否不為空(不為0),非空者為真
“字符串1” =“字符串2” 字符串1是否等于字符串2,等于者為真
“字符串1” !=“字符串2” 字符串1是否不等于字符串2,不等于者為真
注意:
1)字符串或者字符串變量一定要加雙引號
2) = != 的兩端一定要個空格
[root@fenfa tmp]# var="/tmp/yuki01"
You have mail in /var/spool/mail/root
[root@fenfa tmp]# [ -z "$var" ] && echo 1 || echo 0
0
[root@fenfa tmp]# var1=""
[root@fenfa tmp]# [ -z "$var1" ] && echo 1 || echo 0
1
(-z: 字符串空為真)
[root@fenfa day04]# [ "`netstat -tunlp|grep 22|awk -F "[ :]+" 'NR==1{print $5}'`" = "22" ] && echo 1 || echo 0
1
三) 整數比較操作符

注意:在單中括號里,使用-gt -ge -le -lt -eq -ne等
[root@fenfa tmp]# [ "`ps -ef|grep sshd|wc -l`" -gt 1 ] && echo 1 || echo 0
1
[root@fenfa day04]# [ 5 > 2 ] && echo 1 || echo 0
1
[root@fenfa day04]# [ 5 -gt 2 ] && echo 1 || echo 0
1
[root@fenfa day04]# [[ 5 > 2 ]] && echo 1 || echo 0
1
You have mail in /var/spool/mail/root
[root@fenfa day04]# [[ 5 -gt 2 ]] && echo 1 || echo 0
1
(不建議在雙中括號里,使用-gt,-le等)
四)邏輯操作符

[root@fenfa day04]# [ -f /etc/hosts -a -f /etc/service ] && echo 1 || echo 0
0
You have mail in /var/spool/mail/root
[root@fenfa day04]# [ -f /etc/hosts -a -f /etc/services ] && echo 1 || echo 0
1
[root@fenfa day04]# [[ -f /etc/hosts && -f /etc/services ]] && echo 1 || echo 0
1
&&:
只有左右兩邊都為1的時候,結果才為真
一般可以作為短路操作符
&&: 只有前面為真(1),后面的才會被執行
||: 只有前面為假(0),后面才會被執行
[root@fenfa day04]# f1=/etc/rc.local
You have mail in /var/spool/mail/root
[root@fenfa day04]# f2=/etc/fstab
[root@fenfa day04]# [ -f "$f1" -a -f "$f2" ] && echo 1 || echo 0
1
[root@fenfa day04]# [[ -f "$f1" && -f "$f2" ]] && echo 1 || echo 0
1
(在雙中括號里,一定要用&&,||, 在單中括號里要用-a -o)
[root@fenfa day04]# [ -z "$f1" -a -z "$f2" ] && echo 1 || echo 0
0
(-z: 字符串不空為假,就執行||后面的)
,