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

我做错了什么?


当前回答

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

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

其他回答

是脚本中的第一行:

#!/bin/bash

or

#!/bin/sh

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

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

$ sh myscript

你应该试试:

$ bash myscript

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

$ ./myscript

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

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

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

[[ 1==1 ]] # OK

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

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

在您的终端执行:

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