Shell編程-05-Shell中條件測試與比較
Shell腳本條件測試
? ? 在Shell腳本中各種條件結構和流程控制結構中會存在各種判斷比較,然後根據不同的判斷結果執行不同的操作或命令,返回的結果通常為真或假。常見的條件測試如下所示:
- 條件測試-1
test <測試表達式>
利用test命令進行條件測試表達式,test命令和表達式中間至少有一個空格
- 條件測試-2
[ <測試表達式> ]
利用[]進行條件測試的方法,表達式與[]前後均需要有至少一個空格
- 條件測試-3
[[ <測試表達式> ]]
利用[ [ ] ]進行條件測試的方法,表達式與[ [ ] ]前後均需要有至少一個空格
- 條件測試-4
((<測試表達式>))
利用(())進行條件測試的方法,表達式與(())前後不需要有空格,一般用於if語句
以上幾種用法的註意事項如下所示:
- 1、test命令和[]功能是等價的
- 2、[[]]是test命令的擴展
- 3、(())常用於計算
- 4、[[]]可以使用通配符進行模式匹配
- 5、&&、||、<、>等操作符可以用在[[]],但不能用在[]中,在[]中一般用-a、-o、-gt、-lt等進行代替
test條件測試
? 其基本語法如下所示:
test <測試表達式>
? 示例如下所示:
[root@localhost Test]# test -f para.sh && echo true || echo false true [root@localhost Test]# test -f para && echo true || echo false false
以上命令用於測試文件是否為普通文件或文件是否存在,如果是則輸出true,否則輸出false
[]條件測試
? 其基本語法如下所示:
[ <測試表達式> ]
? []與test功能是等價的,即test的所有判斷選項均可以直接在[]中使用。示例如下所示:
[root@localhost Test]# [ -f para.sh ] && echo true || echo false
true
[root@localhost Test]# [ -f para ] && echo true || echo false
false
以上註意表達式與[]間的空格
[[]]條件測試
? 其基本語法如下所示:
[[ <測試表達式> ]]
? 其示例如下所示:
[root@localhost Test]# [[ -f para.sh ]] && echo true || echo false
true
[root@localhost Test]# [[ -f para ]] && echo true || echo false
false
以上註意表達式與[[]]間的空格
- 1、以上幾種用法,推薦采用[]寫法,其他三種了解即可
- 2、如需查看更詳細的用法,可以使用man 進行查看
Shell文件測試
常用文件測試表達式
? 如果在編寫腳本時需要操作一個對象,需要先對對象進行測試,在滿足條件後才會進行相應的操作或命令,從而避免程序出錯和資源浪費。操作的對象通常為文件、字符串和數字等,常見的文件測試表達式如下所示:
文件操作符 | 英文含義 | 含義 |
---|---|---|
-b FILE | block | 文件存在且為塊設備文件則為真 |
-c FILE | character | 文件存在且為字符設備文件則為真 |
-d FILE | directory | 文件夾存在則為真 |
-f FILE | file | 文件存在且為普通文件則為真 |
-e FILE | exist | 文件存在即為真,不區分文件或文件夾 |
-L FILE | symbolic link | 文件存在且為鏈接文件則為真 |
-O FILE | owner | 文件存在且屬主有有效的UID則為真 |
-G FILE | group | 文件存在且屬組有有效的GID則為真 |
-r FILE | read | 文件存在且具備可讀權限則為真 |
-s FILE | size | 文件存在且文件大小大於0則為真 |
-w FILE | write | 文件存在且具備可寫權限則為真 |
-x FILE | executable | 文件存在且具備可執行權限則為真 |
FILE1 -ef FILE2 | equal | FILE1和FILE2擁有同樣的設備和inode number則為真 |
FILE1 -nt FILE2 | new than | FILE1的修改日期比FILE2新則為真 |
FILE1 -ot FILE2 | older than | FILE1的修改日期比FILE2舊則為真 |
以上更詳細信息可使用命令man test進行查看。
文件測試表達式示例
[root@localhost Test]# [ -d ~/Test ] && echo true || echo false
true # 判斷文件是否為文件夾
[root@localhost Test]# [ -e ~/Test/eval.sh ] && echo true || echo false
true # 判斷文件是否存在
[root@localhost Test]# [ -e ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在
[root@localhost Test]# [ -O ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在且套上有效的UID
[root@localhost Test]# [ -G ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在且套上有效的GID
[root@localhost Test]# ll -d ~/Test/
drwxr-xr-x 2 root root 123 11月 1 17:47 /root/Test/ # 顯示文件信息
[root@localhost Test]# [ -r ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在及可讀權限
[root@localhost Test]# [ -w ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在及可寫權限
[root@localhost Test]# [ -x ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在及可執行權限
[root@localhost Test]# stat eval.sh exec.sh
文件:"eval.sh"
大小:68 塊:8 IO 塊:4096 普通文件
設備:802h/2050d Inode:21590 硬鏈接:1
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近訪問:2018-11-01 17:32:31.559464328 +0800
最近更改:2018-11-01 17:32:19.712464490 +0800
最近改動:2018-11-01 17:32:19.713464490 +0800
創建時間:-
文件:"exec.sh"
大小:89 塊:8 IO 塊:4096 普通文件
設備:802h/2050d Inode:21589 硬鏈接:1
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近訪問:2018-11-01 17:41:17.316457156 +0800
最近更改:2018-11-01 17:40:33.361457755 +0800
最近改動:2018-11-01 17:40:33.361457755 +0800
創建時間:-
[root@localhost Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
false # 判斷文件是否存在相同的設備和inode number
[root@localhost Test]# [ eval.sh -nt exec.sh ] && echo true || echo false
false # 判斷文件eval.sh修改日期是否比文件exec.sh新
[root@localhost Test]# [ eval.sh -ot exec.sh ] && echo true || echo false
true # 判斷文件eval.sh修改日期是否比文件exec.sh舊
[root@localhost Test]# echo $centos
# 變量未定義
[root@localhost Test]# [ -f $centos ] && echo true || echo false
true # 變量未定義,卻返回true,邏輯不符
[root@localhost Test]# [ -f "$centos" ] && echo true || echo false
false # 添加引號後,邏輯正確
註意事項如下:
1、在判斷文件的讀寫執行權限,不單單是看文件rwx屬性,還要根據當前測試的用戶是否也具備相應的操作權限
2、在使用[]進行判斷時,需要註意雙引號特殊用法
Shell字符測試
常用字符測試表達式
? ?字符測試常用於判斷字符是否相同,長度是否為零、字符是否為空等,常見的字符測試如下所示:
字符操作符 | 英文含義 | 含義 |
---|---|---|
-n STRING | nonzero | 字符串長度不為零,則為真 |
-z STRING | zero | 字符串長度為零,則為真 |
STRING1 = STRING2 | STRING1和STRING2是相等,則為真 | |
STRING1 != STRING2 | STRING1和STRING2是不相等,則為真 |
字符測試註意事項:
1、字符測試中一定要添加雙引號
2、比較符號的兩端一定要添加空格
字符測試表達式示例
[root@localhost Test]# [ -n "Test" ] && echo true || echo false
true
[root@localhost Test]# [ -z "Test" ] && echo true || echo false
false
[root@localhost Test]# [ "Test" = "Test" ] && echo true || echo false
true
[root@localhost Test]# [ "Test" != "Test" ] && echo true || echo false
false
[root@localhost Test]# [ -z "" ] && echo true || echo false
true
Shell整數測試
常用整數測試表達式
[]/test比較符號 | 英文含義 | ( ( ) )/[ [ ] ]比較符號 |
---|---|---|
-eq | equal | ==/= |
-ge | greater than or equal | >= |
-gt | greater than | > |
-le | less than or equal | <= |
-lt | less than | < |
-ne | not equal | != |
整數測試表達式註意事項如下所示:
1、=和!=也可以用在[]中進行比較,但在[]中使用< 和 > 時,需要進行轉義,否則結果會出現不正確的情況
2、比較符號兩端需要添加空格
整數測表達式示例
[root@localhost ~]# [ 8 > 4 ] && echo true || echo false
true
[root@localhost ~]# [ 4 > 8 ] && echo true || echo false
true # 未進行轉義時,結果輸出存在錯誤
[root@localhost ~]# [ 4 \> 8 ] && echo true || echo false
false # 進行轉義後,結果輸出正確
[root@localhost ~]# [ 8 != 8 ] && echo true || echo false
false
[root@localhost ~]# [ 8 == 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 = 8 ] && echo true || echo false
true
[root@localhost ~]# [ 4 -gt 8 ] && echo true || echo false
false
[root@localhost ~]# [ 4 -lt 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -eq 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -ne 8 ] && echo true || echo false
false
[root@localhost ~]# [[ 8 -ne 8 ]] && echo true || echo false
false
[root@localhost ~]# [[ 8 != 8 ]] && echo true || echo false
false
[root@localhost ~]# (( 8 != 8 )) && echo true || echo false
false
[root@localhost ~]# (( 8 == 8 )) && echo true || echo false
true
[root@localhost ~]# a=90;b=97 # 通過變量傳遞進行比較
[root@localhost ~]# [ $a -gt $b ] && echo true || echo false
false
[root@localhost ~]# [ $a -le $b ] && echo true || echo false
true
在使用整數比較時,需要註意數字必須是整數,否則會出現報錯。[]與(())區別如下所示:
[ number1 -lt number2 ] # 比較運算符兩端和[]間必須有空格
((number1<number2)) # (())無空格要求
Shell邏輯測試
常用邏輯測試表達式
[]/test比較符號 | 英文含義 | ( ( ) )/[ [ ] ]比較符號 |
---|---|---|
-a | and | && |
-o | or | || |
! | not | ! |
在以上邏輯測試結果中
- 1:代表結果為真True
- 0:代表結果為假False
- -a和-o僅適用於[],不能用在[[]]
- []和[ [] ]兩端必須有空格,( ( ) )無此要求
邏輯測試表達式示例
[root@localhost ~]# [ 8>7 -a 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>21 ] && echo true || echo false
true
[root@localhost ~]# [ ! 9>21 ] && echo true || echo false
true
[root@localhost ~]# [ -f /etc/hosts -a /etc/passwd ] && echo true || echo false
true
[root@localhost ~]# a="/etc/hosts";b="/etc/passwd"
[root@localhost ~]# [ -f $a -o -f $b ] && echo true || echo false
true
[root@localhost ~]# [ -f "$a" ] && [ -f "$b" ] && echo true || echo false
true
[root@localhost ~]# [ -f $a ] && [ -f $b ] && echo true || echo false
true
[root@localhost ~]# [[ -f $a -a -f $b ]] && echo true || echo false
-bash: 條件表達式中有語法錯誤
-bash: `-a‘ 附近有語法錯誤
[root@localhost ~]# [[ -f $a && -f $b ]] && echo true || echo false
true
Shell條件測試總結
測試表達式符號 | [ ] | test | [ [ ] ] | ( ( ) ) |
---|---|---|---|---|
邊界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
邏輯操作符 | -a/-o/! | -a/-o/! | &&/||/! | &&/||/! |
整數比較符 | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= | =/>=/>/<=/</!= |
字符串比較符 | =/==/!= | =/==/!= | =/==/!= | =/==/!= |
是否支持通配符 | 不支持 | 不支持 | 支持 | 不支持 |
本文同步在微信訂閱號上發布,如各位小夥伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下面的二維碼添加關註:
Shell編程-05-Shell中條件測試與比較