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
sh和bash是两个不同的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