原文在此
學(xué)習(xí)shell的時(shí)候總是被shell里的條件判斷方式搞得頭疼,經(jīng)常不知道改 用[],[[]],(())還是test,let,而很少有書把它們的關(guān)系講解的很清楚(應(yīng)該是我悟性差或是看書太少),今天總結(jié)一下,基礎(chǔ)的東西如它們 的使用方法不再贅述,重點(diǎn)說(shuō)說(shuō)它們的區(qū)別的使用時(shí)應(yīng)該注意的地方。
先說(shuō)[]和test,兩者是一樣的,在命令行里test expr和[ expr ]的效果相同。test的三個(gè)基本作用是判斷文件、判斷字符串、判斷整數(shù)。支持使用與或非將表達(dá)式連接起來(lái)。要注意的有:
1.test中可用的比較運(yùn)算符只有==和!=,兩者都是用于字符串比較的,不可用于整數(shù)比較,整數(shù)比較只能使用-eq, -gt這種形式。無(wú)論是字符串比較還是整數(shù)比較都千萬(wàn)不要使用大于號(hào)小于號(hào)。當(dāng)然,如果你實(shí)在想用也是可以的,對(duì)于字符串比較可以使用尖括號(hào)的轉(zhuǎn)義形式, 如果比較"ab"和"bc":[ ab \< bc ],結(jié)果為真,也就是返回狀態(tài)為0.
然后是[[ ]],這是內(nèi)置在shell中的一個(gè)命令,它就比剛才說(shuō)的test強(qiáng)大的多了。支持字符串的模式匹配(使用=~操作符時(shí)甚至支持shell的正則表達(dá) 式)。簡(jiǎn)直強(qiáng)大的令人發(fā)指!邏輯組合可以不使用test的-a,-o而使用&&,||這樣更親切的形式(針對(duì)c、Java程序員)。當(dāng) 然,也不用想的太復(fù)雜,基本只要記住
1.字符串比較時(shí)可以把右邊的作為一個(gè)模式(這是右邊的字符串不加雙引號(hào)的情況下。如果右邊的字符串加了雙引號(hào),則認(rèn)為是一個(gè)文本字符串。),而不僅僅是一個(gè)字符串,比如[[ hello == hell? ]],結(jié)果為真。
另外要注意的是,使用[]和[[]]的時(shí)候不要吝嗇空格,每一項(xiàng)兩邊都要有空格,[[ 1 == 2 ]]的結(jié)果為“假”,但[[ 1==2 ]]的結(jié)果為“真”!后一種顯然是錯(cuò)的
3.最后就是let和(()),兩者也是一樣的(或者說(shuō)基本上是一樣的,雙括號(hào)比let稍弱一些)。主要進(jìn)行算術(shù)運(yùn)算(上面的兩個(gè)都不行),也比較適合進(jìn) 行整數(shù)比較,可以直接使用熟悉的<,>等比較運(yùn)算符??梢灾苯邮褂米兞棵鐅ar而不需要$var這樣的形式。支持分號(hào)隔開的多個(gè)表達(dá)式