Shell腳本條件測(cè)試
? ? 在Shell腳本中各種條件結(jié)構(gòu)和流程控制結(jié)構(gòu)中會(huì)存在各種判斷比較溉卓,然后根據(jù)不同的判斷結(jié)果執(zhí)行不同的操作或命令昔榴,返回的結(jié)果通常為真或假绽族。常見的條件測(cè)試如下所示:
- 條件測(cè)試-1
test <測(cè)試表達(dá)式>
利用test命令進(jìn)行條件測(cè)試表達(dá)式卖怜,test命令和表達(dá)式中間至少有一個(gè)空格
- 條件測(cè)試-2
[ <測(cè)試表達(dá)式> ]
利用[]進(jìn)行條件測(cè)試的方法键思,表達(dá)式與[]前后均需要有至少一個(gè)空格
- 條件測(cè)試-3
[[ <測(cè)試表達(dá)式> ]]
利用[ [ ] ]進(jìn)行條件測(cè)試的方法础爬,表達(dá)式與[ [ ] ]前后均需要有至少一個(gè)空格
- 條件測(cè)試-4
((<測(cè)試表達(dá)式>))
利用(())進(jìn)行條件測(cè)試的方法,表達(dá)式與(())前后不需要有空格,一般用于if語句
以上幾種用法的注意事項(xiàng)如下所示:
- 1吼鳞、test命令和[]功能是等價(jià)的
- 2看蚜、[[]]是test命令的擴(kuò)展
- 3、(())常用于計(jì)算
- 4赔桌、[[]]可以使用通配符進(jìn)行模式匹配
- 5供炎、&&、||疾党、<音诫、>等操作符可以用在[[]],但不能用在[]中雪位,在[]中一般用-a竭钝、-o、-gt雹洗、-lt等進(jìn)行代替
test條件測(cè)試
? 其基本語法如下所示:
test <測(cè)試表達(dá)式>
? 示例如下所示:
[root@localhost Test]# test -f para.sh && echo true || echo false
true
[root@localhost Test]# test -f para && echo true || echo false
false
以上命令用于測(cè)試文件是否為普通文件或文件是否存在香罐,如果是則輸出true,否則輸出false
[]條件測(cè)試
? 其基本語法如下所示:
[ <測(cè)試表達(dá)式> ]
? []與test功能是等價(jià)的队伟,即test的所有判斷選項(xiàng)均可以直接在[]中使用穴吹。示例如下所示:
[root@localhost Test]# [ -f para.sh ] && echo true || echo false
true
[root@localhost Test]# [ -f para ] && echo true || echo false
false
以上注意表達(dá)式與[]間的空格
[[]]條件測(cè)試
? 其基本語法如下所示:
[[ <測(cè)試表達(dá)式> ]]
? 其示例如下所示:
[root@localhost Test]# [[ -f para.sh ]] && echo true || echo false
true
[root@localhost Test]# [[ -f para ]] && echo true || echo false
false
以上注意表達(dá)式與[[]]間的空格
- 1、以上幾種用法嗜侮,推薦采用[]寫法港令,其他三種了解即可
- 2、如需查看更詳細(xì)的用法锈颗,可以使用man 進(jìn)行查看
Shell文件測(cè)試
常用文件測(cè)試表達(dá)式
? 如果在編寫腳本時(shí)需要操作一個(gè)對(duì)象顷霹,需要先對(duì)對(duì)象進(jìn)行測(cè)試,在滿足條件后才會(huì)進(jìn)行相應(yīng)的操作或命令击吱,從而避免程序出錯(cuò)和資源浪費(fèi)淋淀。操作的對(duì)象通常為文件、字符串和數(shù)字等覆醇,常見的文件測(cè)試表達(dá)式如下所示:
文件操作符 | 英文含義 | 含義 |
---|---|---|
-b FILE | block | 文件存在且為塊設(shè)備文件則為真 |
-c FILE | character | 文件存在且為字符設(shè)備文件則為真 |
-d FILE | directory | 文件夾存在則為真 |
-f FILE | file | 文件存在且為普通文件則為真 |
-e FILE | exist | 文件存在即為真朵纷,不區(qū)分文件或文件夾 |
-L FILE | symbolic link | 文件存在且為鏈接文件則為真 |
-O FILE | owner | 文件存在且屬主有有效的UID則為真 |
-G FILE | group | 文件存在且屬組有有效的GID則為真 |
-r FILE | read | 文件存在且具備可讀權(quán)限則為真 |
-s FILE | size | 文件存在且文件大小大于0則為真 |
-w FILE | write | 文件存在且具備可寫權(quán)限則為真 |
-x FILE | executable | 文件存在且具備可執(zhí)行權(quán)限則為真 |
FILE1 -ef FILE2 | equal | FILE1和FILE2擁有同樣的設(shè)備和inode number則為真 |
FILE1 -nt FILE2 | new than | FILE1的修改日期比FILE2新則為真 |
FILE1 -ot FILE2 | older than | FILE1的修改日期比FILE2舊則為真 |
以上更詳細(xì)信息可使用命令man test進(jìn)行查看炭臭。
文件測(cè)試表達(dá)式示例
[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 # 判斷文件是否存在及可讀權(quán)限
[root@localhost Test]# [ -w ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在及可寫權(quán)限
[root@localhost Test]# [ -x ~/Test/ ] && echo true || echo false
true # 判斷文件是否存在及可執(zhí)行權(quán)限
[root@localhost Test]# stat eval.sh exec.sh
文件:"eval.sh"
大小:68 塊:8 IO 塊:4096 普通文件
設(shè)備:802h/2050d Inode:21590 硬鏈接:1
權(quán)限:(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
最近改動(dòng):2018-11-01 17:32:19.713464490 +0800
創(chuàng)建時(shí)間:-
文件:"exec.sh"
大信鄞恰:89 塊:8 IO 塊:4096 普通文件
設(shè)備:802h/2050d Inode:21589 硬鏈接:1
權(quán)限:(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
最近改動(dòng):2018-11-01 17:40:33.361457755 +0800
創(chuàng)建時(shí)間:-
[root@localhost Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
false # 判斷文件是否存在相同的設(shè)備和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 # 添加引號(hào)后搅吁,邏輯正確
注意事項(xiàng)如下:
1威创、在判斷文件的讀寫執(zhí)行權(quán)限,不單單是看文件rwx屬性谎懦,還要根據(jù)當(dāng)前測(cè)試的用戶是否也具備相應(yīng)的操作權(quán)限
2肚豺、在使用[]進(jìn)行判斷時(shí),需要注意雙引號(hào)特殊用法
Shell字符測(cè)試
常用字符測(cè)試表達(dá)式
? ?字符測(cè)試常用于判斷字符是否相同界拦,長(zhǎng)度是否為零吸申、字符是否為空等,常見的字符測(cè)試如下所示:
字符操作符 | 英文含義 | 含義 |
---|---|---|
-n STRING | nonzero | 字符串長(zhǎng)度不為零寞奸,則為真 |
-z STRING | zero | 字符串長(zhǎng)度為零呛谜,則為真 |
STRING1 = STRING2 | STRING1和STRING2是相等在跳,則為真 | |
STRING1 != STRING2 | STRING1和STRING2是不相等枪萄,則為真 |
字符測(cè)試注意事項(xiàng):
1、字符測(cè)試中一定要添加雙引號(hào)
2猫妙、比較符號(hào)的兩端一定要添加空格
字符測(cè)試表達(dá)式示例
[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整數(shù)測(cè)試
常用整數(shù)測(cè)試表達(dá)式
[]/test比較符號(hào) | 英文含義 | ( ( ) )/[ [ ] ]比較符號(hào) |
---|---|---|
-eq | equal | ==/= |
-ge | greater than or equal | >= |
-gt | greater than | > |
-le | less than or equal | <= |
-lt | less than | < |
-ne | not equal | != |
整數(shù)測(cè)試表達(dá)式注意事項(xiàng)如下所示:
1瓷翻、=和!=也可以用在[]中進(jìn)行比較,但在[]中使用< 和 > 時(shí)割坠,需要進(jìn)行轉(zhuǎn)義齐帚,否則結(jié)果會(huì)出現(xiàn)不正確的情況
2、比較符號(hào)兩端需要添加空格
整數(shù)測(cè)表達(dá)式示例
[root@localhost ~]# [ 8 > 4 ] && echo true || echo false
true
[root@localhost ~]# [ 4 > 8 ] && echo true || echo false
true # 未進(jìn)行轉(zhuǎn)義時(shí)彼哼,結(jié)果輸出存在錯(cuò)誤
[root@localhost ~]# [ 4 \> 8 ] && echo true || echo false
false # 進(jìn)行轉(zhuǎn)義后对妄,結(jié)果輸出正確
[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 # 通過變量傳遞進(jìn)行比較
[root@localhost ~]# [ $a -gt $b ] && echo true || echo false
false
[root@localhost ~]# [ $a -le $b ] && echo true || echo false
true
在使用整數(shù)比較時(shí),需要注意數(shù)字必須是整數(shù)敢朱,否則會(huì)出現(xiàn)報(bào)錯(cuò)剪菱。[]與(())區(qū)別如下所示:
[ number1 -lt number2 ] # 比較運(yùn)算符兩端和[]間必須有空格
((number1<number2)) # (())無空格要求
Shell邏輯測(cè)試
常用邏輯測(cè)試表達(dá)式
[]/test比較符號(hào) | 英文含義 | ( ( ) )/[ [ ] ]比較符號(hào) |
---|---|---|
-a | and | && |
-o | or | || |
! | not | ! |
在以上邏輯測(cè)試結(jié)果中
- 1:代表結(jié)果為真True
- 0:代表結(jié)果為假False
- -a和-o僅適用于[],不能用在[[]]
- []和[ [] ]兩端必須有空格拴签,( ( ) )無此要求
邏輯測(cè)試表達(dá)式示例
[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: 條件表達(dá)式中有語法錯(cuò)誤
-bash: `-a' 附近有語法錯(cuò)誤
[root@localhost ~]# [[ -f $a && -f $b ]] && echo true || echo false
true
Shell條件測(cè)試總結(jié)
測(cè)試表達(dá)式符號(hào) | [ ] | test | [ [ ] ] | ( ( ) ) |
---|---|---|---|---|
邊界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
邏輯操作符 | -a/-o/! | -a/-o/! | &&/||/! | &&/||/! |
整數(shù)比較符 | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= | =/>=/>/<=/</!= |
字符串比較符 | =/==/!= | =/==/!= | =/==/!= | =/==/!= |
是否支持通配符 | 不支持 | 不支持 | 支持 | 不支持 |