前言:本博文是參考老男孩出版的《shell編程實戰(zhàn)》這本文檔寫的,這是寫的非常好的一個文檔。
金牛網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
博文大綱:
- 一、shell腳本的條件測試
- 二、文件測試表達式
- 三、字符串測試表達式
- 四、整數(shù)二元比較操作符
- 五、邏輯操作符
通常,在bash的各種條件結(jié)構(gòu)和流程控制結(jié)構(gòu)中都要進行各種測試,然后根據(jù)測試結(jié)果執(zhí)行不同的操作,有時也會與if等條件語句相結(jié)合,來完成測試判斷,以減少程序運行的錯誤。
執(zhí)行條件測試表達式后通常會返回“真”或“假”,就像執(zhí)行命令后的返回值為0表示真,非0表示假一樣。
在bash編程里,條件測試常用的語法形式如下:
- 語法1:test <測試表達式>:這是利用test命令進行條件測試表達的方法,test命令和“<測試表達式>”之間至少有一個空格。
- 語法2: [ <測試表達式> ]:這是通過[ ](單中括號)進行條件測試表達式的方法,和test命令的用法相同,這是比較推薦的一種方法。[ ]的邊界和內(nèi)容之間至少有一個空格。
- 語法3:[[ <測試表達式> ]]:這是通過[[ ]](雙中括號)進行條件測試表達式的方法,是比test和[ ]更新的語法。[[ ]]的邊界和內(nèi)容之間至少有一個空格。
- 語法4:(( <測試表達式>)):這是通過(( ))(雙小括號)進行條件測試表達式的方法,一般用于if語句里。(())(雙小括號)兩端不需要有空格。
- 語法1中的test命令和語法2中的[ ]是一樣的。語法3中的[[]]是擴展test命令,語法4中的(())常用于計算,我一般使用的是語法2,方便些。
范例①:
[root@localhost ~]# test -f file && echo "true" || echo "false"
false
上面語句的意思是如果file文件存在,則輸出true,否則(||)輸出false。這里的&&表示并且的意思。-f參數(shù)用于測試文件是否為普通文件,test命令若執(zhí)行成功(為真),則執(zhí)行&&后面的命令,而||后面的命令則是test命令執(zhí)行失敗之后(為假)所執(zhí)行的命令。
test命令測試表達式的邏輯也可以用上面表達式形式的一半邏輯(即僅有一個&&或||)來測試,示例如下:
[root@localhost ~]# test -f file && echo 1 #若表達式成功,則輸出1
1
[root@localhost ~]# test -f file || echo 0 #若表達式不成功,則輸出0。
0
在上面的-f選項表示文件存在且為普通文件則表達式成立(我這里沒有file這個文件所以不成立)。
邏輯操作符&&和|| 的兩端即可以有空格,也可以無空格,這主要是個人的習(xí)慣,在盡量減少空格的輸入的同時,還要考慮代碼的簡潔、美觀。
在上面的命令中,語法格式如下:
關(guān)于test測試表達式的更多使用選項,可以執(zhí)行man test查看幫助。
test命令測試的功能很強大,但是和[ ]、[[ ]]的功能有所重合,因此,在實際工作中選擇一種自己喜歡的語法就好(我一般使用“[ ]”測試功能),對于其他的語法,能讀懂別人寫的腳本就可以了。
[ ]條件測試的語法格式為:[ <測試表達式> ]
注意:中括號內(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
[ ] 測試語法的格式如下:
關(guān)于[[ ]]的使用方法和[ ]類似,區(qū)別在于[[ ]]的應(yīng)用屬于[ ]的擴展命令,功能給豐富些,如果雙中括號里的表達式成立(為真),則執(zhí)行&&后面的命令,否則執(zhí)行 || 后面的命令。
在[[]]中可以使用通配符等進行模式匹配;并且&&、||、>、<等操作符可以應(yīng)用于[[]]中,但不能應(yīng)用于[]中,在[]中一般使用-a、-o、-gt(用于整數(shù))、-lt(用于整數(shù))等操作符代替上文提到的用于[[]]中的符號。除了使用通配符功能之外,建議放棄這個雙中括號的寫法,雖然它是較新的test命令的語法格式。
[[ ]]測試語法的格式如下:
有關(guān)test、[ ]、[[ ]]這些操作符的用法,可以通過help test查詢即可得到幫助,完整的[ ]、[[ ]]用法可通過man bash來獲取。
如果在shell編程中要處理一個對象,一般是先對對象進行測試,只有在確定它符合要求時,才應(yīng)進行操作處理,這樣做的好處就是避免程序出錯及無謂的系統(tǒng)資源消耗,這個需要測試的對象可以是文件、字符串、數(shù)字等。
在編寫文件測試表達式時,常用的文件測試操作符如下:
上面的這些操作符號對于[[ ]]、[ ]、test的測試表達式是通用的。
注意:測試文件的讀、寫、執(zhí)行等屬性,不光是根據(jù)文件屬性rwx的標識來判斷,還要看當(dāng)前執(zhí)行測試的用戶是否真的可以按照對應(yīng)的權(quán)限操作該文件。
如果用來測試一個變量,則被測試的變量需要加雙引號將變量引起來,否則可能會出錯。如下:
[root@localhost ~]# echo $abc #確認該變量沒有存在
[root@localhost ~]# [ -f $abc ] && echo 1 || echo 0 #不加雙引號的話,明明不存在,可照樣輸出了1
1
[root@localhost ~]# [ -f "$abc" ] && echo 1 || echo 0 #加上雙引號就正常了
0
當(dāng)然,如果是文件的實體路徑,那么加引號與不加引號的結(jié)果是一樣的。
字符串測試操作符的作用包括:比較兩個字符串是否相同、測試字符串的長度是否為0、字符串是否為NULL等。
常用的字符串測試操作符如下:
使用字符測試操作時需要注意以下事項:
- 對于字符串的測試,一定要將字符串加雙引號之后再進行比較,如[ -n "$abc" ]。
- 比較符號(例如=和!=)的兩端一定要有空格。
- “!=”和“=”可用于比較兩個字符串是否相同。
針對上面符號的特別說明:
- “=”和“!=”也可在[ ] 做比較使用,但在[ ]中使用包含“>”和“<”的符號時,需要用反斜杠“\”進行轉(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等的寫法,可以使用類似>、<的寫法。
常用的邏輯操作符如下:
關(guān)于上述操作符的具體解釋如下:
———————— 本文至此結(jié)束,感謝閱讀 ————————
當(dāng)前名稱:shell腳本的條件測試與比較
當(dāng)前URL:http://jinyejixie.com/article38/iiccpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、微信小程序、網(wǎng)站改版、面包屑導(dǎo)航、網(wǎng)站設(shè)計、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)