2010-04-14 136 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相同。