在Bash脚本中,以下代码段之间的区别是什么?
1)使用单括号:
if [ "$1" = VALUE ] ; then
# code
fi
2)使用双括号:
if [[ "$1" = VALUE ]] ; then
# code
fi
答案 0 :(得分:8)
[[]]构造是[]的更通用的Bash版本。这是从ksh88采用的扩展测试命令。
使用[[...]]测试构造,而不是[...]可以防止脚本中的许多逻辑错误。例如,&&,||,<和>尽管在[]构造中给出了错误,但是运算符在[[]]测试中工作。
More info on the Advanced Bash Scripting Guide
在您的代码段中,由于您没有使用任何其他功能,因此没有区别。
答案 1 :(得分:2)
[
是内置的bash,[[
是关键字。请参阅bash FAQ。要注意:互联网上的大多数bash脚本都是废话(不能使用带空格的文件名,引入隐藏的安全漏洞等),而bash比人们想象的要难得多。如果你想进行bash编程,你应该至少学习bash guide和bash 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。