Shell 中test 單中括號[] 雙中括號[[]] 的區別


Shell test 單中括號[] 雙中括號[[]] 的區別

在寫Shell腳本的時候,經常在寫條件判斷語句時不知道該用[] 還是 [[]],首先我們來看他們的類別:


$type [ [[ test
[ is a shell builtin
[[ is a shell keyword
test is a shell builtin

[ test 是 Shell 的內部命令,而[[是Shell的關鍵字。


$test -f settings.py && echo True
True

$[ -f settings.py ] && echo True
True

[ test 是相等的。


$[ 2 < 1 ] && echo True || echo False
True

$[[ 2 < 1 ]] && echo True || echo False
False

既然是命令, 它就和參數組合為一體被 shell 解釋,那樣比如 ">" "<" 就被 shell 解釋為重定向符號了。關鍵字卻不這樣。


x=1
y=1


$[ $x == 1 && $y == 1 ] && echo True || echo False
-bash: [: missing `]'
False


$[[ $x == 1 && $y == 1 ]] && echo True || echo False
True


$[ $x == 1 -a $y == 1 ] && echo True || echo False
True

[[中使用&&||表示邏輯與和邏輯或。[ 中使用 -a -o 表示邏輯與和邏輯或。


$[[ 'abcd' == a*d ]] && echo True || echo False
True


$[ 'abcd' == a*d ] && echo True || echo False
False

[[支持字符串的模式匹配,使用=~操作符時甚至支持shell的正則表達式。字符串比較時可以把右邊的作為一個模式,而不僅僅是一個字符串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字符串或通配符,不需要引號。

總結:

使用[[ ... ]]條件判斷結構,而不是[ ... ],能夠防止腳本中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中,

但是如果出現在[ ]結構中的話,會報錯。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

如果不使用雙括號, 則為if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]

bash把雙中括號中的表達式看作一個單獨的元素,並返回一個退出狀態碼。


$[ !(pip list | grep pip) ] && echo True || echo False
-bash: [: too many arguments
False


$[[ !(pip list | grep pip) ]] && echo True || echo False
True

參考

http://blog.csdn.net/taiyang1987912/article/details/39551385
http://blog.csdn.net/yongan1006/article/details/7195303


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM