首先要清楚的是在shell中[]和[[]]都是命令,和我們熟悉的ls、cd地位一樣shell把它們都認做命令,就是說在命令輸入[]和[[]]是不會報錯(輸入時[]和[[]]中間要空格哦),並且有命令返回狀態碼的。
在shell手冊中,[]出現在內建命令章節,[[]]出現在條件結構章節。
http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
http://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs
下面簡單說下它們的異同。
相同點:主要應用場景都是用來執行條件表達式的判斷。
不同點:
1.在[[ ]]中不會進行word splitting和filename expansion,而在[ ]中會進行。
word splitting和filename expansion是shell的兩個特性,直譯就是分詞和文件名展開,分詞一般在參數展開后進行,分詞即將一個單元分解成幾個單元,文件名展開即將星號展開為當前工作目錄下所有的文件。
當變量a為空時,[ -n $a ]和[ -z $a ]都會返回0,這不是我們期望的結果,原因在於進行參數展開($a)后,會進行word splitting,而a為空,word splitting會移除空值,所以[ -n $a ]和[ -z $a ]實際是執行[ -n ]和[ -z ],而[ ]中僅一個參數時且非空都是返回0的,所以 使用[ ]進行條件判斷時,最好加上引號
2.[[ ]]中使用==,!=,~=時可以進行正則匹配
buddy@buddy-PC:~$ a="1 2" buddy@buddy-PC:~$ [ -n $a ] bash: [: 1: 需要二元表達式 buddy@buddy-PC:~$ [[ -n $a ]] buddy@buddy-PC:~$ [ -n "$a" ] buddy@buddy-PC:~$ a= buddy@buddy-PC:~$ buddy@buddy-PC:~$ [ -n $a ] buddy@buddy-PC:~$ echo $? 0 buddy@buddy-PC:~$ [ -z $a ] buddy@buddy-PC:~$ echo $? 0 buddy@buddy-PC:~$ [[ -n $a ]] buddy@buddy-PC:~$ echo $? 1 buddy@buddy-PC:~$ [[ -z $a ]] buddy@buddy-PC:~$ echo $? 0 buddy@buddy-PC:~$
buddy@buddy-PC:~$ [[ -n ]]
bash: 一元條件運算符使用了未預期的參數 `]]'
bash: `]]' 附近有語法錯誤
buddy@buddy-PC:~$