我对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/sh
是dash
,而不是bash
, dash
不支持双括号关键字(或者在发布的时候没有,我没有双重检查)。 你可以通过明确地调用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 [[ ... ]] ...