您好,登錄后才能下訂單哦!
前言:本博文是參考老男孩出版的《shell編程實戰》這本文檔寫的,這是寫的非常好的一個文檔。
博文大綱:
- 一、shell腳本的條件測試
- 二、文件測試表達式
- 三、字符串測試表達式
- 四、整數二元比較操作符
- 五、邏輯操作符
通常,在bash的各種條件結構和流程控制結構中都要進行各種測試,然后根據測試結果執行不同的操作,有時也會與if等條件語句相結合,來完成測試判斷,以減少程序運行的錯誤。
執行條件測試表達式后通常會返回“真”或“假”,就像執行命令后的返回值為0表示真,非0表示假一樣。
在bash編程里,條件測試常用的語法形式如下:
- 語法1:test <測試表達式>:這是利用test命令進行條件測試表達的方法,test命令和“<測試表達式>”之間至少有一個空格。
- 語法2: [ <測試表達式> ]:這是通過[ ](單中括號)進行條件測試表達式的方法,和test命令的用法相同,這是比較推薦的一種方法。[ ]的邊界和內容之間至少有一個空格。
- 語法3:[[ <測試表達式> ]]:這是通過[[ ]](雙中括號)進行條件測試表達式的方法,是比test和[ ]更新的語法。[[ ]]的邊界和內容之間至少有一個空格。
- 語法4:(( <測試表達式>)):這是通過(( ))(雙小括號)進行條件測試表達式的方法,一般用于if語句里。(())(雙小括號)兩端不需要有空格。
- 語法1中的test命令和語法2中的[ ]是一樣的。語法3中的[[]]是擴展test命令,語法4中的(())常用于計算,我一般使用的是語法2,方便些。
范例①:
[root@localhost ~]# test -f file && echo "true" || echo "false"
false
上面語句的意思是如果file文件存在,則輸出true,否則(||)輸出false。這里的&&表示并且的意思。-f參數用于測試文件是否為普通文件,test命令若執行成功(為真),則執行&&后面的命令,而||后面的命令則是test命令執行失敗之后(為假)所執行的命令。
test命令測試表達式的邏輯也可以用上面表達式形式的一半邏輯(即僅有一個&&或||)來測試,示例如下:
[root@localhost ~]# test -f file && echo 1 #若表達式成功,則輸出1
1
[root@localhost ~]# test -f file || echo 0 #若表達式不成功,則輸出0。
0
在上面的-f選項表示文件存在且為普通文件則表達式成立(我這里沒有file這個文件所以不成立)。
邏輯操作符&&和|| 的兩端即可以有空格,也可以無空格,這主要是個人的習慣,在盡量減少空格的輸入的同時,還要考慮代碼的簡潔、美觀。
在上面的命令中,語法格式如下:
關于test測試表達式的更多使用選項,可以執行man test查看幫助。
test命令測試的功能很強大,但是和[ ]、[[ ]]的功能有所重合,因此,在實際工作中選擇一種自己喜歡的語法就好(我一般使用“[ ]”測試功能),對于其他的語法,能讀懂別人寫的腳本就可以了。
[ ]條件測試的語法格式為:[ <測試表達式> ]
注意:中括號內部的兩端要有空格,[ ]和test等價,即test的所有判斷選項都可直接在[ ]里使用。
test條件測試與[ ]中括號條件測試語法的區別:
[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
[ ] 測試語法的格式如下:
關于[[ ]]的使用方法和[ ]類似,區別在于[[ ]]的應用屬于[ ]的擴展命令,功能給豐富些,如果雙中括號里的表達式成立(為真),則執行&&后面的命令,否則執行 || 后面的命令。
在[[]]中可以使用通配符等進行模式匹配;并且&&、||、>、<等操作符可以應用于[[]]中,但不能應用于[]中,在[]中一般使用-a、-o、-gt(用于整數)、-lt(用于整數)等操作符代替上文提到的用于[[]]中的符號。除了使用通配符功能之外,建議放棄這個雙中括號的寫法,雖然它是較新的test命令的語法格式。
[[ ]]測試語法的格式如下:
有關test、[ ]、[[ ]]這些操作符的用法,可以通過help test查詢即可得到幫助,完整的[ ]、[[ ]]用法可通過man bash來獲取。
如果在shell編程中要處理一個對象,一般是先對對象進行測試,只有在確定它符合要求時,才應進行操作處理,這樣做的好處就是避免程序出錯及無謂的系統資源消耗,這個需要測試的對象可以是文件、字符串、數字等。
在編寫文件測試表達式時,常用的文件測試操作符如下:
上面的這些操作符號對于[[ ]]、[ ]、test的測試表達式是通用的。
注意:測試文件的讀、寫、執行等屬性,不光是根據文件屬性rwx的標識來判斷,還要看當前執行測試的用戶是否真的可以按照對應的權限操作該文件。
如果用來測試一個變量,則被測試的變量需要加雙引號將變量引起來,否則可能會出錯。如下:
[root@localhost ~]# echo $abc #確認該變量沒有存在
[root@localhost ~]# [ -f $abc ] && echo 1 || echo 0 #不加雙引號的話,明明不存在,可照樣輸出了1
1
[root@localhost ~]# [ -f "$abc" ] && echo 1 || echo 0 #加上雙引號就正常了
0
當然,如果是文件的實體路徑,那么加引號與不加引號的結果是一樣的。
字符串測試操作符的作用包括:比較兩個字符串是否相同、測試字符串的長度是否為0、字符串是否為NULL等。
常用的字符串測試操作符如下:
使用字符測試操作時需要注意以下事項:
- 對于字符串的測試,一定要將字符串加雙引號之后再進行比較,如[ -n "$abc" ]。
- 比較符號(例如=和!=)的兩端一定要有空格。
- “!=”和“=”可用于比較兩個字符串是否相同。
針對上面符號的特別說明:
- “=”和“!=”也可在[ ] 做比較使用,但在[ ]中使用包含“>”和“<”的符號時,需要用反斜杠“\”進行轉義,有時不轉義雖然語法不會報錯,但是結果可能會不對。
- 也可以在[[ ]]中使用包含“-gt”和“-lt”的符號,但是不建議這樣使用。
- 比較符號兩端也要有空格。
使用舉例:
[root@localhost ~]# [ 2 > 1 ] && echo 1 || echo 0 #看起來沒問題哦,別著急,繼續往下看
1
[root@localhost ~]# [ 2 < 1 ] && echo 1 || echo 0 #看吧,命名條件不成立,可還是輸出了1
1
[root@localhost ~]# [ 2 \< 1 ] && echo 1 || echo 0 #轉義一下再看,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
建議在使用中,還是老老實實的對照上表來使用吧,別給自己找麻煩。對于生產環境中的整數比較,推薦使用[ ](類似-eq的用法)。
關于[ ]、[[ ]]、(( ))用法總結:
- 整數加雙引號的比較是對的。
- [[ ]]中用類似-eq的寫法是對的,[[ ]]中用類似>、<的寫法也可能不對,有可能只會比較第一位,邏輯結果不對。
- [ ]中用類似>、<的寫法在語法上雖然可能沒錯,但邏輯結果不對,可以使用=、!=正確比較。
- (( ))中不能使用類似-eq等的寫法,可以使用類似>、<的寫法。
常用的邏輯操作符如下:
關于上述操作符的具體解釋如下:
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。