shell測試命令test、[ ]、[[ ]],shell測試命令test

來源:互聯網
上載者:User

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註:若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.