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