shell中[ ]和[[ ]]命令的區別


首先要清楚的是在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:~$

 


免責聲明!

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



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