Bash脚本if语句

时间:2010-04-14 21:00:51

标签: bash unix

在Bash脚本中,以下代码段之间的区别是什么?

1)使用单括号:

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

2)使用双括号:

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

5 个答案:

答案 0 :(得分:8)

  

[[]]构造是[]的更通用的Bash版本。这是从ksh88采用的扩展测试命令。

     

使用[[...]]测试构造,而不是[...]可以防止脚本中的许多逻辑错误。例如,&&,||,<和>尽管在[]构造中给出了错误,但是运算符在[[]]测试中工作。

More info on the Advanced Bash Scripting Guide

在您的代码段中,由于您没有使用任何其他功能,因此没有区别。

答案 1 :(得分:2)

[是内置的bash,[[是关键字。请参阅bash FAQ。要注意:互联网上的大多数bash脚本都是废话(不能使用带空格的文件名,引入隐藏的安全漏洞等),而bash比人们想象的要难得多。如果你想进行bash编程,你应该至少学习bash guidebash pitfalls

答案 2 :(得分:1)

使用[[抑制括号中表达式的正常单词拆分和路径名扩展。它还支持许多加法操作,如模式匹配

答案 3 :(得分:0)

以防万一需要可移植性:

对于可移植性测试,您可以通过Heirloom项目获取Bourne shell,或者:

http://freshmeat.net/projects/bournesh

(例如,在Mac OS X上,/ bin / sh不是纯粹的Bourne shell。)

答案 4 :(得分: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&lt;同样的&gt;和stdout。

相关问题