2010-04-14 173 views
13

在Bash腳本中,以下片段有什麼區別?Bash腳本if語句

1)使用單括號:

if [ "$1" = VALUE ] ; then 
# code 
fi 

2)使用雙括號:

if [[ "$1" = VALUE ]] ; then 
# code 
fi 
+0

[提出問題](http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) – 2010-04-14 22:56:15

回答

8

的[[]]構建體的[]中的更通用的擊版本。這是從ksh88採用的擴展測試命令。

使用[[]]測試結構,而不是可以防止腳本中的許多邏輯錯誤。例如,儘管在[]構造中給出了一個錯誤,但是在[[]]測試中可以使用& &,||,<和>運算符。

More info on the Advanced Bash Scripting Guide

在您的代碼片段中,沒有任何區別,因爲您沒有使用任何附加功能。

1

使用[[可抑制括號中表達式的正常詞分割和路徑名擴展。它還可以啓用一些附加操作,如模式匹配

2

[是bash內建的,[[是關鍵字。請參閱bash FAQ。請注意:互聯網上的大多數bash腳本都是廢話(不要與帶空格的文件名一起工作,引入隱藏的安全漏洞等),而且bash要比人們想象的要難得多。如果你想做bash編程,你至少應該學習bash guidebash pitfalls

0

只是在需要的情況下,便攜性:

對於便攜性的測試,你可以得到的是Bourne通過傳家寶項目殼或:

http://freshmeat.net/projects/bournesh

(在Mac OS X,例如,/ bin中/ sh不是純Bourne外殼。)

0

這也是一個外部程序,這並不意味着它不是內建的。

which [ 
/usr/bin/[ 

在你必須使用-lt單括號「小於」別名<,而其他人則可以使用<

if [ 3 -lt 4 ] ; then echo yes ; fi 
yes 
if [ 3 < 4 ] ; then echo yes ; fi 
bash: 4: No such file or directory 
if [[ 3 < 4 ]] ; then echo yes ; fi 
yes 
if [[ 3 -lt 4 ]] ; then echo yes ; fi 
yes 

4:沒有這樣的文件的手段,它試圖從讀名爲「4」的文件 - 重定向stdin <>和stdout相同。