shell測試命令test、[ ]、[[ ]],shell測試命令test
本文目錄:
1.1 條件運算式
1.2 test和[ ]的用法說明
1.3 [[ ]]
1.4 使用建議
test可用於測試運算式,支援測試的範圍包括:字串比較,算術比較,檔案存在性、屬性、類型等判斷。例如,判斷檔案是否為空白、檔案是否存在、是否是目錄、變數是否大於5、字串是否等於"longshuai"、字串是否為空白等等。在shell中,幾乎所有的判斷都使用test實現。
其中[]完全等價於test,只是寫法不同。雙中括弧[[]]基本等價於[],它支援更多的條件運算式,還允許在雙中括弧內使用邏輯運算子"&&"、"||"、"!"和"()",但這些使用單中括弧都能實現,只不過多寫幾個單中括弧而已。單中括弧[]無法實現的功能是Regex匹配,而[[]]可以實現。因此,在能使用單中括弧的情況下,無需考慮使用雙中括弧。
test、[ ]以及[[ ]]都使用條件運算式來完成測試。test和[]用法雖簡單,但文法比較複雜,反而是[[]]的文法較為簡單。但不管如何,先解釋條件運算式。
1.1 條件運算式
條件運算式 |
意義 |
1.檔案類檢測,例如[ -e /tmp/a.log ]。如非特別說明,則所有檔案類操作都會追蹤到軟連結的源檔案。 |
-e file |
檔案是否存在(exist) |
-f file |
檔案是否存在且為普通檔案(file) |
-d file |
檔案是否存在且為目錄(directory) |
-b file |
檔案是否存在且為塊裝置block device |
-c file |
檔案是否存在且為字元裝置character device |
-S file |
檔案是否存在且為通訊端檔案Socket |
-p file |
檔案是否存在且為具名管道檔案FIFO(pipe) |
-L file |
檔案是否存在且是一個連結檔案(Link) |
2. 檔案屬性檢測,如test -r /tmp/a.log。如非特別說明,則所有檔案類操作都會追蹤到軟連結的源檔案。 |
-r file |
檔案是否存在且目前使用者可讀 |
-w file |
檔案是否存在且目前使用者可寫 |
-x file |
檔案是否存在且目前使用者可執行 |
-u file |
檔案是否存在且設定了SUID |
-g file |
檔案是否存在且設定了SGID |
-k file |
檔案是否存在且設定了sbit(sticky bit) |
-s file |
檔案是否存在且大小大於0位元組,即用於檢測檔案是否為非空白檔案 |
-N file |
檔案是否存在,且自上次read後是否被modify |
3. 兩個檔案之間的比較,如:test file1 -nt file2 |
file1 -nt file2 |
(newer than)判斷file1是否比file2新 |
file1 -ot file2 |
(older than)判斷file1是否比file2舊 |
file1 -ef file2 |
(equal file)判斷file2與file2是否為同一檔案,可用在判斷hard link的判定上。主要意義在判定,兩個檔案是否均指向同一個分區上的同一個inode |
4. 兩個整數之間的判定,支援正負數,但不支援小數。例如test n1 -eq n2 |
int1 -eq int2 |
兩數值相等(equal) |
int1 -ne int2 |
兩數值不等(not equal) |
int1 -gt int2 |
n1大於n2(greater than) |
int1 -lt int2 |
n1小於n2(less than) |
int1 -ge int2 |
n1大於等於n2(greater than or equal) |
int1 -le int2 |
n1小於等於n2(less than or equal) |
5. 判定字串 |
-z string |
(zero)判定字串是否為空白?若string為空白字串,則為true |
string -n string |
判定字串是否非空?若string為空白字串,則false。註:-n可省略 |
string1 = string2 string1 == string2 |
string1和string2是否相同。相同則返回true。"=="和"="等價,但"="可移植性更好 |
str1 != str2 |
str1是否不等於str2,若不等,則返回true |
str1 > str2 |
str1字母順序是否大於str2,若大於,則返回true |
str1 < str2 |
str1字母順序是否小於str2,若小於,則返回true |
6.邏輯運算子,例如:test -r filename -a -x filename |
-a或&& |
(and)兩運算式同時為true時才為true。"-a"只能在test或[]中使用,&&只能在[[]]中使用 |
-o或|| |
(or)兩運算式任何一個true則為true。"-o"只能在test或[]中使用,||只能在[[]]中使用 |
! |
對錶達式取反 |
( ) |
用於改變運算式的優先順序 |
|
1.2 test和[ ]的用法說明
test和[]的用法非常簡單,但文法較複雜。它們是根據參數的個數來完成測試的,所以測試的結果也依賴於參數的個數。如下所述:
(1).不帶任何參數時,直接返回false。
[root@xuexi ~]# [ ];echo $?1
(2).只有一個參數時,測試運算式採取的是[ arg ],根據條件運算式的說明,僅當arg為非空時返回true。
[root@xuexi ~]# test haha;echo $?0
[root@xuexi ~]# test $abcd;echo $?1
[root@xuexi ~]# test '';echo $?1
(3).兩個參數時,有幾種情況:
①.第一個參數是單目條件運算子,包括檔案類測試(如[ -e file1 ])和[ -n string ]、[ -z string ]。
②.第一個參數是"!"時,則只能是[ ! string ],等價於[ ! -n string ]。因為"!"是對條件運算式取反,所以當string為空白時才true。
③第一個參數不是任何有效操作符。將直接報錯
(4).三個參數時,也有幾種情況:
①.使用了雙目運算子,如[ file1 -nt file2 ],[ init1 -eq int2 ]以及[ string1 != string2 ]。
②.使用了邏輯運算子,如[ string1 -a string2 ]、[ ! -e file ]、[ ! -z string ]、[ ! -n string ]。
③.使用了括弧,則只能是[ (string) ]。
(5).四個參數以上時,則處理方法參照上面。如[ ! string1 == string2 ]、[ string1 == string2 -o string1 == string3 ]。
無論參數數量多少個,總的來說還是對條件運算式的測試,所以最重要的還是條件運算式的邏輯結果。
1.3 [[ ]]
[[]]基本等價於[],但有些功能寫法更簡潔,且[[]]提供了[]所不具備的Regex匹配。所以,[[]]的功能可以認為是[]和expr命令的相加。
文法格式:
[[ conditional_expression ]]
除了以下特別註明的幾項,其餘用法等同[]。
(1).當條件運算式中使用的運算子是"=="或"!="時,該運算子的右邊會被當作pattern被匹配,"=="表示能匹配成功則返回0,"!="則相反。但此時只是萬用字元匹配,不支援Regex匹配。萬用字元包括:"*"、"?"和"[...]"。
例如:
[root@xuexi ~]# [[ abc == a* ]];echo $?0[root@xuexi ~]# [[ abc == a*d ]];echo $?1
(2).當條件運算式中使用的運算子是"=~"時,該運算子的右邊會被當作Regex的pattern被匹配。
例如:
[root@xuexi ~]# [[ abc =~ aa* ]];echo $?0[root@xuexi ~]# [[ abc =~ aa.* ]];echo $?1
(3).除了可以使用邏輯運算子!和(),還可以使用&&、||,分別表示邏輯與和邏輯或,等價於[]的"-a"和"-o"。但是[[]]不再支援"-a"和"-o"。
例如:
[root@xuexi ~]# [[ 3 -eq 3 && 5 -eq 5 ]];echo $? 0
總之,除了模式比對和Regex匹配時需要使用[[]],其餘時候建議使用[ ]。
1.4 使用建議
無論是[]還是[[]],都建議對其內變數、字串使用雙引號包圍。例如:
name="Ma long"[ $name = "Ma long" ]
上面的測試語句將報錯,因為在變數替換階段,$name被替換為Ma long,但它們沒有在引號內,於是進行單詞拆分,這就等價於執行的是[ Ma long = "Ma long" ],顯然這是錯誤的文法。所以,建議加上雙引號:
[ "$name" = "Ma long" ]
另外,在[]和[[]]中,每個地方都有空格。
回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7427357.html註:若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!