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


165

我正在尝试比较bash中的字符串。我已经找到了关于如何在stackoverflow上执行此操作的答案。在我正在尝试的脚本中,我正在使用亚当在提到的问题中提交的代码:

#!/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

我究竟做错了什么?


我可能做错了,但是使用单个方括号始终对我有用。
Markus Unterwaditzer 2012年

1
什么/bin/bash --version打印?
themel 2012年

4
[在这种情况下将无法使用,因为它不支持模式。
Ansgar Wiechers,2012年

Answers:


157

[[是bash-builtin。您/bin/bash似乎并不是真正的重击。


如果我键入:输入'[['我得到[[是一个shell关键字
user1581900 2012年

5
跑步时得到的结果是否相同/bin/bash -c "type [["
Ansgar Wiechers,2012年

42
这发生在我身上,是因为我忘了#!/bin/bash在文件的顶部添加内容
morphistic

12
发生在我身上的原因是,我使用来运行脚本时sh,很沮丧。现在,在找到此答案之前,我只需要重做所有未完成的操作即可。
Louis Loudog Trottier

174

您如何运行脚本?如果你这样做

$ sh myscript

你应该试试:

$ bash myscript

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

$ ./myscript

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


我以这种方式被拒绝。带有sudo ./myscript的命令未找到
user1581900 2012年

11
chmod + x myscript,然后再次运行,不需要sudo
Akos K

2
您如何调用脚本?
Akos K '09

就像你所说。通常我用“ $ sh myscipt.sh”来称呼它。第二次做chmod + x myscript.sh之后,我用./myscript.sh调用它
user1581900 2012年

5
当您通过来运行脚本时,会出现此错误sh myscript.sh,因为它会/bin/sh模拟[[不是内置的Bourne shell 。但是,通过运行脚本./script.sh不会产生错误,因为在那种情况下,应该/bin/bash使用shebang 。
Ansgar Wiechers'9

81

是脚本的第一行:

#!/bin/bash

要么

#!/bin/sh

sh shell会产生此错误消息,而不是bash


1
我也缺少第一行,产生了作者提到的错误!
匿名2015年

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

6
sh不建议您使用发行版的默认设置恕我直言。运行的shell sh应该和dash; 如果没有,那是脚本中的错误。如果需要bash功能,请使用bash,而不要使用sh
2015年

4
这听起来很糟糕
MrVaykadji '16

2
我同意,这只是一个丑陋的解决方法。一个类似但更好的解决方法将是使用justinconover.wordpress.com/2012/05/14/…update-alternatives(在基于debian的linux中),但最后还是一样。
jperelli

13

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


用Ubuntu 16.04和(sh->)破折号0.5.8-2.1ubuntu2进行了一些检查,发现[与“ -eq”和类似命令结合使用时效果很好。有关此上下文的比较运算符的类似信息,可在以下位置找到:stackoverflow.com/questions/10849297/…-我进一步轻视了下一个链接中的(())评估运算符,但由于我的最小侵入性更改似乎失败了/或/这将需要更深层次的代码更改。softpanorama.org/Scripting/Shellorama/Control_structures/...
亚历山大·斯托尔

3

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

bash script.sh arg0 ... argn


这为我解决了!
Djamillah 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.