我对bash脚本非常陌生,在使用双括号时遇到了一个问题。我似乎无法让他们在Ubuntu Server 11.10中工作。我的脚本在if_test.sh中。bash双支架问题
#!/bin/bash
if [[ "14"=="14" ]]; then
echo "FOO"
fi
当我运行这个简单的shell脚本输出我得到的是:if_test.sh:5:[[:未找到
看来,我正在运行后GNU bash的版本4.2.10打 - 从终端版本。任何帮助将不胜感激。谢谢!
我对bash脚本非常陌生,在使用双括号时遇到了一个问题。我似乎无法让他们在Ubuntu Server 11.10中工作。我的脚本在if_test.sh中。bash双支架问题
#!/bin/bash
if [[ "14"=="14" ]]; then
echo "FOO"
fi
当我运行这个简单的shell脚本输出我得到的是:if_test.sh:5:[[:未找到
看来,我正在运行后GNU bash的版本4.2.10打 - 从终端版本。任何帮助将不胜感激。谢谢!
问题在于你的脚本调用。你发出:
$ 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
当我尝试[[“14”-eq“14”]]我仍然得到相同的错误。 – 2012-03-12 11:34:13
奇怪的是,自[bash' 2.02版本开始支持[[''关键字)。你如何执行你的脚本?也许你最终使用不同的shell ... – 2012-03-12 11:37:46
我正在执行它:sudo sh if_test.sh – 2012-03-12 11:38:46
既然你是新来的脚本,你可能不知道[[
是bashism。你甚至可能甚至不知道什么是抨击行为,但是迄今为止所给出的答案正在通过促进它们的使用,使你走向一个发展迟缓的脚本未来的道路。
要检查变量是否与任何Bourne shell的字符串匹配,可以执行test $V = 14
如果要比较整数,请使用test $V -eq 14
。唯一的区别是如果$ V看起来不像一个整数,那么后者会产生一个错误。有充足的理由引用变量(test "$V" = 14
),但引号通常是不必要的,我认为这是造成常见混淆的根本原因,因为"14"=="14"
与"14==14"
相同,更明显的是未使用'=='作为运营商。
有几件事情需要注意:使用一个单一的“=”而不是“==”,因为不是所有的炮弹承认“==”,该[
命令等同于test
,但需要的]
和许多SH最终的说法编码指南建议使用test
,因为它通常会生成更易于理解的代码,[[
只能被有限数量的shell识别(这是您的主要问题,因为您的shell看起来不识别[[
并正在查找该名称的命令。是令人惊讶的,如果你的shebang确实指定/bin/bash
而不是/bin/sh
)。
我的回答并不适用于@ lots_of_questions的问题具体,但你也可以运行到这个问题,如果你有错符在脚本的顶部:
#!/bin/sh
if [[ ... ]]
...
你应该改变,要
#!/bin/bash
if [[ ... ]]
...
顺便说一句,没有空格,这不是比较'14'到'14',它检查字符串'14 == 14'是否为空。它会给出与[[“11”==“99”]]完全相同的结果,因为该字符串也不是空的。 – 2018-01-30 23:19:44