我是新手来编写脚本,并且在使用双括号时遇到了问题。我似乎无法让他们在Ubuntu Server 11.10中工作。我的脚本位于if_test.sh中。
#!/bin/bash
if [[ "14"=="14" ]]; then
echo "FOO"
fi
当我运行这个简单的shell脚本时,我得到的输出是:if_test.sh:5:[[:not found
从终端运行bash --version后,我似乎正在运行GNU bash版本4.2.10。任何帮助将不胜感激。谢谢!
答案 0 :(得分:37)
问题在于您的脚本调用。你发出了:
$ sudo sh if_test.sh
在Ubuntu系统上,/bin/sh
is dash
, not bash
和dash
不支持双括号关键字(或者在发布时没有,我没有仔细检查过)。您可以通过显式调用bash
来解决您的问题:
$ sudo bash if_test.sh
或者,您可以使脚本可执行并依赖shebang line:
$ chmod +x if_test.sh
$ sudo ./if_test.sh
另请注意,在双方括号之间使用时,==
是pattern matching operator,而不是相等运算符。如果要测试相等性,可以使用-eq
:
if [[ "14" -eq "14" ]]; then
echo "FOO"
fi
if (( 14 == 14 )); then
echo "FOO"
fi
答案 1 :(得分:6)
由于您不熟悉脚本,因此您可能不知道[[
是一种基础。你可能甚至都不知道什么是基础,但到目前为止给出的两个答案都会引导你走向一个通过促进它们的使用来阻止脚本未来发展的道路。
要检查变量是否与任何Bourne shell风格的字符串匹配,您可以执行test $V = 14
如果要比较整数,请使用test $V -eq 14
。唯一的区别是,如果$ V看起来不像整数,后者会产生错误。引用变量(test "$V" = 14
)有充分的理由,但引号通常是不必要的,我认为是常见混淆的根本原因,因为"14"=="14"
与"14==14"
相同更明显的是'=='没有被用作运算符。
有几点需要注意:使用单个'='而不是'==',因为并非所有shell都识别'==',[
命令与test
相同但需要]
的最终论点和许多sh编码指南建议使用test
,因为它通常会生成更易理解的代码,[[
只能通过有限数量的shell识别(这是您的主要问题,因为您的shell似乎无法识别[[
,并且正在寻找该名称的命令。如果您的shebang确实指定了/bin/bash
而不是/bin/sh
,这是令人惊讶的。
答案 2 :(得分:5)
我的回答并不特别适用于@ lots_of_questions的问题,但如果脚本顶部有错误的说明符,也会遇到此问题:
#!/bin/sh
if [[ ... ]]
...
您应该将其更改为
#!/bin/bash
if [[ ... ]]
...