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