bash双括号问题

我对bash脚本非常陌生,在使用双括号时遇到了一个问题。 我似乎无法让他们在Ubuntu服务器11.10工作。 我的脚本在if_test.sh。

#!/bin/bash if [[ "14"=="14" ]]; then echo "FOO" fi 

当我运行这个简单的shell脚本时,我得到的输出是:if_test.sh:5:[[:not found

从terminal运行bash –version后,我似乎在运行GNU bash 4.2.10版。 任何帮助将不胜感激。 谢谢!

问题在于你的脚本调用。 您正在签发:

 $ sudo sh if_test.sh 

在Ubuntu系统上, /bin/shdash ,而不是bashdash不支持双括号关键字(或者在发布的时候没有,我没有双重检查)。 你可以通过明确地调用bash来解决你的问题:

 $ sudo bash if_test.sh 

或者,您可以使脚本可执行并依赖于shebang行 :

 $ chmod +x if_test.sh $ sudo ./if_test.sh 

另请注意,在双方括号之间使用时, ==是模式匹配运算符 ,而不是相等运算符。 如果你想测试平等,你可以使用-eq

 if [[ "14" -eq "14" ]]; then echo "FOO" fi 

或者双括号 :

 if (( 14 == 14 )); then echo "FOO" fi 

既然你对脚本是陌生的,你可能并不知道[[是一个bashism。 你甚至可能不知道什么是抨击行为,但是迄今为止所给出的答案都是通过促进它们的使用,使你走向一个脚踏实地的脚本未来的道路。

要检查一个变量是否与任何Bourne shell的字符串匹配,你可以做test $V = 14如果你想比较整数,使用test $V -eq 14 。 唯一的区别是,如果$ V看起来不像一个整数,那么后者将产生一个错误。 有很好的理由引用这个变量( test "$V" = 14 ),但是引用往往是不必要的,我相信是引起普遍混淆的根源,因为"14"=="14""14==14" ,更明显的是'=='不被用作操作符。

有几点需要注意:使用一个'='而不是'==',因为不是所有的shell都能识别'==', [命令与test是一样的,但需要一个最终的参数] ,许多sh编码指导方针建议使用因为它经常会产生更多可理解的代码, [[只能被有限数量的shell识别(这是你的主要问题,因为你的shell看起来不识别[[并且正在寻找这个名字的命令。如果你的shebang确实指定了/bin/bash而不是/bin/sh )。

我的回答并不适用于@ lots_of_questions的问题,但是如果在脚本的顶部有错误的说明符,也可以遇到这个问题:

 #!/bin/sh if [[ ... ]] ... 

你应该改变它

 #!/bin/bash if [[ ... ]] ...