我正在阅读关于if的bash示例,但一些示例用单方括号编写:
if [ -f $param ]
then
#...
fi
其他带有双方括号的:
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
有什么不同?
我正在阅读关于if的bash示例,但一些示例用单方括号编写:
if [ -f $param ]
then
#...
fi
其他带有双方括号的:
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
有什么不同?
当前回答
在单括号内用于条件测试(即[…]]),所有shell都支持一些操作符,例如单个=,而一些较老的shell不支持使用operator ==。
在双括号内用于条件测试(即[[…]]]),在旧shell和新shell中使用=或==没有区别。
编辑:我还应该注意:在bash中,总是使用双括号[[…]]],因为它比单括号更安全。我将用下面的例子来说明原因:
if [ $var == "hello" ]; then
如果$var恰好是空的,那么这是脚本看到的:
if [ == "hello" ]; then
这会破坏你的剧本。解决方案是使用双括号,或者总是记得在变量周围加上引号(“$var”)。双括号是更好的防御性编码实践。
其他回答
你可以使用双方括号进行简单的正则表达式匹配,例如:
如果[[$1 =~ "*bar"]];然后
(只要您使用的bash版本支持此语法)
在单括号内用于条件测试(即[…]]),所有shell都支持一些操作符,例如单个=,而一些较老的shell不支持使用operator ==。
在双括号内用于条件测试(即[[…]]]),在旧shell和新shell中使用=或==没有区别。
编辑:我还应该注意:在bash中,总是使用双括号[[…]]],因为它比单括号更安全。我将用下面的例子来说明原因:
if [ $var == "hello" ]; then
如果$var恰好是空的,那么这是脚本看到的:
if [ == "hello" ]; then
这会破坏你的剧本。解决方案是使用双括号,或者总是记得在变量周围加上引号(“$var”)。双括号是更好的防御性编码实践。
单个[]是posix shell兼容的条件测试。
Double[[]]是标准[]的扩展,bash和其他shell(例如zsh, ksh)都支持它。它们支持额外的操作(以及标准的posix操作)。例如:||代替-o, regex匹配=~。在bash手册中关于条件构造的部分中可以找到更完整的差异列表。
当您希望您的脚本可以跨shell移植时,请使用[]。如果您想要[]不支持的条件表达式并且不需要可移植,请使用[[]]。
[[是一个bash关键字,类似于[命令(但比[命令更强大)。
See
http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
除非您正在编写POSIX sh,否则我们推荐[[。
Bash手册说:
当与[[一起使用时,' < '和' > '操作符将按字典顺序排序 使用当前区域设置。test命令使用ASCII码 排序。
(test命令与[]相同)