我正在尝试比较 bash 中的字符串。我已经在 stackoverflow 上找到了如何做的答案。在我正在尝试的脚本中,我正在使用 Adam 在上述问题中提交的代码:
#!/bin/bash
string='My string';
if [[ "$string" == *My* ]]
then
echo "It's there!";
fi
needle='y s'
if [[ "$string" == *"$needle"* ]]; then
echo "haystack '$string' contains needle '$needle'"
fi
我还尝试了 ubuntuforums 的方法,您可以在第二篇文章中找到
if [[ $var =~ regexp ]]; then
#do something
fi
在这两种情况下,我都会收到错误:
[[: not found
我究竟做错了什么?
/bin/bash --version
打印什么?
[
在这种情况下不起作用,因为它不支持模式。
[[
是 bash 内置的。您的 /bin/bash
似乎不是真正的 bash。
来自评论:
在文件顶部添加 #!/bin/bash
你是如何运行你的脚本的?如果你做了
$ sh myscript
你应该试试:
$ bash myscript
或者,如果脚本是可执行的:
$ ./myscript
sh 和 bash 是两个 different shells。在第一种情况下,您将脚本作为参数传递给 sh 解释器,而在第二种情况下,您在第一行决定将使用哪个解释器。
sh myscript.sh
运行脚本时,该错误是预期的,因为 /bin/sh
模拟了一个 Bourne shell,其中 [[
不是内置的。但是,通过 ./script.sh
运行脚本不会产生错误,因为在这种情况下,shebang 应该会导致使用 /bin/bash
。
是脚本中的第一行:
#!/bin/bash
或者
#!/bin/sh
sh shell 产生此错误消息,而不是 bash
正如@Ansgar 提到的,[[
是一种bashism,即内置于Bash 中,不适用于其他shell。如果您希望脚本可移植,请使用 [
。比较也需要不同的语法:将 ==
更改为 =
。
if [ $MYVAR = "myvalue" ]; then
echo "true"
else
echo "false"
fi
我在安装 Heroku Toolbelt 时遇到了这个问题
这就是我解决问题的方法
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash
如您所见,/bin/sh 是指向“dash”(不是 bash)的链接,而 [[
是 bash 语法糖度。所以我只是替换了 /bin/bash 的链接。 在你的系统中小心使用这样的 rm!
$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
sh
是不明智的。与 sh
一起运行的 shell 应该与 dash
一起工作;如果没有,那是脚本中的错误。如果您需要 bash
功能,请使用 bash
,而不是 sh
。
update-alternatives
(在 debian-based-linux 中)像 justinconover.wordpress.com/2012/05/14/… 一样,但最终,它会是相同的。
如果您知道自己在使用 bash,但仍然出现此错误,请确保在 if 中使用空格。
[[1==1]] # This outputs error
[[ 1==1 ]] # OK
运行脚本时指定 bash 而不是 sh。我个人注意到它们在 ubuntu 12.10 下是不同的:
bash script.sh arg0 ... argn
在您的终端中执行:
sudo update-alternatives --install /bin/sh sh /bin/bash 100
不定期副业成功案例分享
/bin/bash -c "type [["
时是否得到相同的结果?#!/bin/bash
sh
运行了脚本,很沮丧。现在我只需要在找到这个答案之前重做我撤消的所有事情。