我正在尝试比较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
我做错了什么?
答案 0 :(得分:141)
您如何运行脚本? 如果你做了
$ sh myscript
你应该尝试:
$ bash myscript
或者,如果脚本是可执行的:
$ ./myscript
sh 和 bash 是两个different shells。在第一种情况下,您将脚本作为参数传递给sh解释器,在第二种情况下,您决定使用解释器的第一行。
答案 1 :(得分:112)
[[
是一个bash-builtin。您的/bin/bash
似乎不是真正的重击。
答案 2 :(得分:72)
是脚本中的第一行:
#!/bin/bash
或
#!/bin/sh
sh shell会产生此错误消息,而不是bash
答案 3 :(得分:14)
这就是我解决问题的方法
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash
如你所见,/ bin / sh是“破折号”(不是bash)的链接,[[
是bash语法糖度。所以我只是将链接替换为/ bin / bash。 在您的系统中小心使用这样的rm!
$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
答案 4 :(得分:8)
正如@Ansgar所提到的,[[
是一种基础,即内置于Bash中,不适用于其他shell。如果您希望脚本可移植,请使用[
。比较还需要不同的语法:将==
更改为=
。
答案 5 :(得分:3)
运行脚本时指定bash而不是sh。我个人注意到它们在ubuntu 12.10下是不同的:
bash script.sh arg0 ... argn
答案 6 :(得分:0)
如果您知道自己正在使用bash,但仍然遇到此错误,请确保使用空格写if。
[[1==1]] # This outputs error
[[ 1==1 ]] # OK
答案 7 :(得分:0)
在终端中执行:
sudo update-alternatives --install /bin/sh sh /bin/bash 100
答案 8 :(得分:-1)
这发生在我从 Dockerfile 启动脚本时:
RUN . /script.sh
这为我解决了:
RUN /script.sh