string比较在bash中。 [[: 未find

我正在比较bash中的string。 我已经find了如何在stackoverflow上做的答案。 在脚本中,我正在使用在提到的问题中由Adam提交的代码:

#!/bin/bash string='My string'; if [[ "$string" == *My* ]] then echo "It's there!"; fi needle='ys' if [[ "$string" == *"$needle"* ]]; then echo "haystack '$string' contains needle '$needle'" fi 

我也尝试了从第二篇文章中可以find的ubuntuforums的方法

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

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

 [[: not found 

我究竟做错了什么?

[[是一个bash-builtin。 你的/bin/bash似乎不是真正的bash。

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

 $ sh myscript 

你应该试试:

 $ bash myscript 

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

 $ ./myscript 

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

是脚本中的第一行:

 #!/bin/bash 

要么

 #!/bin/sh 

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

安装Heroku Toolbelt时遇到了这个问题

这就是我解决问题的方法

 $ ls -l /bin/sh lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash 

正如你所看到的,/ bin / sh是“破折号”(而不是bash)的链接,而[[ bash语法糖分。 所以我只是将链接replace为/ bin / bash。 小心在你的系统中使用rm!

 $ sudo rm /bin/sh $ sudo ln -s /bin/bash /bin/sh 

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

运行脚本时指定bash而不是sh。 我个人发现,在Ubuntu 12.10下它们是不同的:

bash script.sh arg0 ... argn