我正在阅读关于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命令与[]相同)