溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

shell腳本的條件測試與比較

發(fā)布時間:2020-07-20 01:05:27 來源:網(wǎng)絡(luò) 閱讀:443 作者:warrent 欄目:系統(tǒng)運維

前言:本博文是參考老男孩出版的《shell編程實戰(zhàn)》這本文檔寫的,這是寫的非常好的一個文檔。

博文大綱:

  • 一、shell腳本的條件測試
  • 二、文件測試表達(dá)式
  • 三、字符串測試表達(dá)式
  • 四、整數(shù)二元比較操作符
  • 五、邏輯操作符

通常,在bash的各種條件結(jié)構(gòu)和流程控制結(jié)構(gòu)中都要進(jìn)行各種測試,然后根據(jù)測試結(jié)果執(zhí)行不同的操作,有時也會與if等條件語句相結(jié)合,來完成測試判斷,以減少程序運行的錯誤。

執(zhí)行條件測試表達(dá)式后通常會返回“真”或“假”,就像執(zhí)行命令后的返回值為0表示真,非0表示假一樣。

一、shell腳本的條件測試

在bash編程里,條件測試常用的語法形式如下:

  • 語法1:test <測試表達(dá)式>:這是利用test命令進(jìn)行條件測試表達(dá)的方法,test命令和“<測試表達(dá)式>”之間至少有一個空格。
  • 語法2: [ <測試表達(dá)式> ]:這是通過[ ](單中括號)進(jìn)行條件測試表達(dá)式的方法,和test命令的用法相同,這是比較推薦的一種方法。[ ]的邊界和內(nèi)容之間至少有一個空格。
  • 語法3:[[ <測試表達(dá)式> ]]:這是通過[[ ]](雙中括號)進(jìn)行條件測試表達(dá)式的方法,是比test和[ ]更新的語法。[[ ]]的邊界和內(nèi)容之間至少有一個空格。
  • 語法4:(( <測試表達(dá)式>)):這是通過(( ))(雙小括號)進(jìn)行條件測試表達(dá)式的方法,一般用于if語句里。(())(雙小括號)兩端不需要有空格。
  • 語法1中的test命令和語法2中的[ ]是一樣的。語法3中的[[]]是擴展test命令,語法4中的(())常用于計算,我一般使用的是語法2,方便些。
  • 在[[ ]](雙中括號)中可以使用通配符等進(jìn)行模式匹配,這是其區(qū)別于其他幾種語法格式的地方。
  • &&、||、>、<等操作符可以應(yīng)用于[[ ]]中,但不能應(yīng)用于[ ]中,在[ ]中一般使用-a、-o、-gt、-lt(用于整數(shù))來代替上面的操作。
  • 對于整數(shù)的關(guān)系運算,也可以使用shell的算數(shù)運算符(( ))。

1、test條件測試的簡單語法及示例

范例①:

[root@localhost ~]# test  -f file && echo "true" || echo "false"
false

上面語句的意思是如果file文件存在,則輸出true,否則(||)輸出false。這里的&&表示并且的意思。-f參數(shù)用于測試文件是否為普通文件,test命令若執(zhí)行成功(為真),則執(zhí)行&&后面的命令,而||后面的命令則是test命令執(zhí)行失敗之后(為假)所執(zhí)行的命令。

test命令測試表達(dá)式的邏輯也可以用上面表達(dá)式形式的一半邏輯(即僅有一個&&或||)來測試,示例如下:

[root@localhost ~]# test -f file && echo 1    #若表達(dá)式成功,則輸出1
1
[root@localhost ~]# test -f file || echo 0    #若表達(dá)式不成功,則輸出0。
0

在上面的-f選項表示文件存在且為普通文件則表達(dá)式成立(我這里沒有file這個文件所以不成立)。

邏輯操作符&&和|| 的兩端即可以有空格,也可以無空格,這主要是個人的習(xí)慣,在盡量減少空格的輸入的同時,還要考慮代碼的簡潔、美觀。

在上面的命令中,語法格式如下:
shell腳本的條件測試與比較

關(guān)于test測試表達(dá)式的更多使用選項,可以執(zhí)行man test查看幫助。

test命令測試的功能很強大,但是和[ ]、[[ ]]的功能有所重合,因此,在實際工作中選擇一種自己喜歡的語法就好(我一般使用“[ ]”測試功能),對于其他的語法,能讀懂別人寫的腳本就可以了。

2、[ ](中括號)條件測試語法及示例

[ ]條件測試的語法格式為:[ <測試表達(dá)式> ]
注意:中括號內(nèi)部的兩端要有空格,[ ]和test等價,即test的所有判斷選項都可直接在[ ]里使用。

test條件測試與[ ]中括號條件測試語法的區(qū)別:

[root@localhost ~]# test  -f file && echo "true" || echo "false"    #使用test語法
false
[root@localhost ~]# [ -f file ] && echo "true" || echo "false"    #使用[ ]語法
false
[root@localhost ~]# test -f file || echo "false"    #使用test語法
false
[root@localhost ~]# test -f file && echo "true"   #使用test語法
[root@localhost ~]# [ -f file ] && echo "true"   #使用[ ]語法
[root@localhost ~]# [ -f file ] || echo "false"     #使用[ ]語法
false

[ ] 測試語法的格式如下:

shell腳本的條件測試與比較

3、[[ ]]條件測試語法

關(guān)于[[ ]]的使用方法和[ ]類似,區(qū)別在于[[ ]]的應(yīng)用屬于[ ]的擴展命令,功能給豐富些,如果雙中括號里的表達(dá)式成立(為真),則執(zhí)行&&后面的命令,否則執(zhí)行 || 后面的命令。

在[[]]中可以使用通配符等進(jìn)行模式匹配;并且&&、||、>、<等操作符可以應(yīng)用于[[]]中,但不能應(yīng)用于[]中,在[]中一般使用-a、-o、-gt(用于整數(shù))、-lt(用于整數(shù))等操作符代替上文提到的用于[[]]中的符號。除了使用通配符功能之外,建議放棄這個雙中括號的寫法,雖然它是較新的test命令的語法格式。

[[ ]]測試語法的格式如下:

shell腳本的條件測試與比較

有關(guān)test、[ ]、[[ ]]這些操作符的用法,可以通過help test查詢即可得到幫助,完整的[ ]、[[ ]]用法可通過man bash來獲取。

二、文件測試表達(dá)式

如果在shell編程中要處理一個對象,一般是先對對象進(jìn)行測試,只有在確定它符合要求時,才應(yīng)進(jìn)行操作處理,這樣做的好處就是避免程序出錯及無謂的系統(tǒng)資源消耗,這個需要測試的對象可以是文件、字符串、數(shù)字等。

在編寫文件測試表達(dá)式時,常用的文件測試操作符如下:

shell腳本的條件測試與比較

上面的這些操作符號對于[[ ]]、[ ]、test的測試表達(dá)式是通用的。

注意:測試文件的讀、寫、執(zhí)行等屬性,不光是根據(jù)文件屬性rwx的標(biāo)識來判斷,還要看當(dāng)前執(zhí)行測試的用戶是否真的可以按照對應(yīng)的權(quán)限操作該文件。

如果用來測試一個變量,則被測試的變量需要加雙引號將變量引起來,否則可能會出錯。如下:

[root@localhost ~]# echo $abc       #確認(rèn)該變量沒有存在

[root@localhost ~]# [ -f $abc ] && echo 1 || echo 0 #不加雙引號的話,明明不存在,可照樣輸出了1
1
[root@localhost ~]# [ -f "$abc" ] && echo 1 || echo 0    #加上雙引號就正常了
0

當(dāng)然,如果是文件的實體路徑,那么加引號與不加引號的結(jié)果是一樣的。

三、字符串測試表達(dá)式

字符串測試操作符的作用包括:比較兩個字符串是否相同、測試字符串的長度是否為0、字符串是否為NULL等。

常用的字符串測試操作符如下:
shell腳本的條件測試與比較

使用字符測試操作時需要注意以下事項:

  • 對于字符串的測試,一定要將字符串加雙引號之后再進(jìn)行比較,如[ -n "$abc" ]。
  • 比較符號(例如=和!=)的兩端一定要有空格。
  • “!=”和“=”可用于比較兩個字符串是否相同。

四、整數(shù)二元比較操作符

shell腳本的條件測試與比較

針對上面符號的特別說明:

  • “=”和“!=”也可在[ ] 做比較使用,但在[ ]中使用包含“>”和“<”的符號時,需要用反斜杠“\”進(jìn)行轉(zhuǎn)義,有時不轉(zhuǎn)義雖然語法不會報錯,但是結(jié)果可能會不對。
  • 也可以在[[ ]]中使用包含“-gt”和“-lt”的符號,但是不建議這樣使用。
  • 比較符號兩端也要有空格。

使用舉例:

[root@localhost ~]# [ 2 > 1 ] && echo 1 || echo 0    #看起來沒問題哦,別著急,繼續(xù)往下看
1
[root@localhost ~]# [ 2 < 1 ] && echo 1 || echo 0    #看吧,命名條件不成立,可還是輸出了1
1
[root@localhost ~]# [ 2 \< 1 ] && echo 1 || echo 0     #轉(zhuǎn)義一下再看,OK了。
0
[root@localhost ~]# [ 2 = 1 ] && echo 1 || echo 0    #比較相等符號是正確的
0
[root@localhost ~]# [ 2 = 2 ] && echo 1 || echo 0    #輸出正確
1
[root@localhost ~]# [ 2 != 2 ] && echo 1 || echo 0    #輸出正確
0

建議在使用中,還是老老實實的對照上表來使用吧,別給自己找麻煩。對于生產(chǎn)環(huán)境中的整數(shù)比較,推薦使用[ ](類似-eq的用法)。

關(guān)于[ ]、[[ ]]、(( ))用法總結(jié):

  • 整數(shù)加雙引號的比較是對的。
  • [[ ]]中用類似-eq的寫法是對的,[[ ]]中用類似>、<的寫法也可能不對,有可能只會比較第一位,邏輯結(jié)果不對。
  • [ ]中用類似>、<的寫法在語法上雖然可能沒錯,但邏輯結(jié)果不對,可以使用=、!=正確比較。
  • (( ))中不能使用類似-eq等的寫法,可以使用類似>、<的寫法。

五、邏輯操作符

常用的邏輯操作符如下:
shell腳本的條件測試與比較

關(guān)于上述操作符的具體解釋如下:

  • 邏輯操作符前后的表達(dá)式是否成立,一般用真假來表示。
  • “!”的中文意思是反,即與一個邏輯值相反的邏輯值。
  • -a的中文意思是“與”(and或&&),前后兩個邏輯值都為“真”,綜合返回值才為“真”,反之為“假”。
  • -o的中文意思是“或”(or或||),前后兩個邏輯值只要有一個為“真”,返回值就為“真”。
  • 連接兩個含有[]、test或[[]]的表達(dá)式可用&&或||來代替。
  • -a和&&的運算規(guī)則:只有邏輯操作符兩端的表達(dá)式都成立時才為真;真(true)表示成立,對應(yīng)的數(shù)字為1;假(false)表示不成立,對應(yīng)的數(shù)字為0。

附加——測試表達(dá)式test、[]、[[]]、(())的區(qū)別總結(jié)

shell腳本的條件測試與比較

———————— 本文至此結(jié)束,感謝閱讀 ————————

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI