bash中的字符串比较。 [[: 未找到

时间:2012-09-01 19:23:57

标签: bash shell ubuntu-11.04 string-comparison

我正在尝试比较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

我做错了什么?

9 个答案:

答案 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)

安装Heroku Toolbelt

时出现此问题

这就是我解决问题的方法

$ 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

这发生在我从 Dockerfile 启动脚本时:

RUN . /script.sh

这为我解决了:

RUN /script.sh