我试图在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

我也尝试了ubuntu论坛的方法,你可以在第二篇文章中找到

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

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

[[: not found

我做错了什么?


[[是bash内置的。你的/bin/bash似乎不是一个真正的bash。

来自一条评论:

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


你是如何运行你的剧本的? 如果你用过

$ sh myscript

你应该试试:

$ bash myscript

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

$ ./myscript

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


是脚本中的第一行:

#!/bin/bash

or

#!/bin/sh

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


我在安装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

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

痛击脚本。argn


正如@Ansgar提到的,[[是bashism,即内置在Bash中,而不适用于其他shell。如果您希望您的脚本是可移植的,请使用[。比较还需要不同的语法:change == to =。

if [ $MYVAR = "myvalue" ]; then
    echo "true"
else
    echo "false"
fi

如果您知道自己在bash上,但仍然得到这个错误,请确保在If语句中使用空格。

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

[[ 1==1 ]] # OK

在您的终端执行:

sudo update-alternatives --install /bin/sh sh /bin/bash 100

使文件可执行,然后不使用sh执行。

通过$ chmod +x文件名使其可执行 然后使用./filename代替sh filename