205

我正在尝试比较 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的方法,您可以在 2nd post 中找到

if [[ $var =~ regexp ]]; then
  #do something
fi

在这两种情况下,我都会收到错误:

[[: not found

我究竟做错了什么?

4

8 回答 8

225

[[是 bash 内置的。您/bin/bash似乎不是真正的 bash。

来自评论:

#!/bin/bash在文件顶部添加

于 2012-09-01T19:27:45.577 回答
204

你是如何运行你的脚本的?如果你做了

$ sh myscript

你应该试试:

$ bash myscript

或者,如果脚本是可执行的:

$ ./myscript

shbash是两个不同的 shell。在第一种情况下,您将脚本作为参数传递给 sh 解释器,而在第二种情况下,您在第一行决定将使用哪个解释器。

于 2012-09-01T19:32:08.447 回答
85

是脚本中的第一行:

#!/bin/bash

或者

#!/bin/sh

sh shell 产生此错误消息,而不是 bash

于 2013-05-06T16:58:25.533 回答
18

正如@Ansgar 所提到的,[[它是一种bashism,即内置于Bash 中,不适用于其他shell。如果您希望脚本可移植,请使用[. 比较也需要不同的语法:更改===.

于 2016-05-30T14:55:26.843 回答
17

我在安装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
于 2013-07-19T18:28:40.587 回答
8

如果您知道自己在使用 bash,但仍然出现此错误,请确保在 if 中使用空格。

[[1==1]] # This outputs error

[[ 1==1 ]] # OK
于 2020-09-26T15:31:23.903 回答
4

运行脚本时指定 bash 而不是 sh。我个人注意到它们在 ubuntu 12.10 下是不同的:

bash script.sh arg0 ... argn

于 2014-12-13T11:46:21.840 回答
1

在您的终端中执行:

sudo update-alternatives --install /bin/sh sh /bin/bash 100
于 2021-05-31T16:02:13.487 回答