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

use*_*900 138 bash shell string-comparison ubuntu-11.04

我试图比较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
Run Code Online (Sandbox Code Playgroud)

我也尝试过你可以在第二篇文章中找到的ubuntuforums方法

if [[ $var =~ regexp ]]; then
  #do something
fi
Run Code Online (Sandbox Code Playgroud)

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

[[: not found
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ako*_*s K 157

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

$ sh myscript
Run Code Online (Sandbox Code Playgroud)

你应该试试:

$ bash myscript
Run Code Online (Sandbox Code Playgroud)

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

$ ./myscript
Run Code Online (Sandbox Code Playgroud)

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

  • 做**chmod + x myscript**,然后再次运行,你不需要sudo (11认同)
  • 当您通过`sh myscript.sh`运行脚本时,会出现错误,因为`/ bin/sh`模拟了一个Bourne shell,其中`[[`不是内置函数.但是,通过`./ script.sh`运行脚本不应该产生错误,因为在这种情况下,shebang应该使用`/ bin/bash`. (4认同)
  • 你是如何调用脚本的? (2认同)

Ans*_*ers 127

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

  • 这件事发生在我身上,因为我忘记在我的文件顶部添加`#!/ bin/bash` (27认同)
  • 很抱歉,因为我用"sh"运行脚本,很多人都感到沮丧.现在我只需要在找到答案之前重做我解开的所有内容. (7认同)
  • 当你运行`/ bin/bash -c"时,你会得到相同的结果[["`? (5认同)

小智 75

是脚本中的第一行:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

要么

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

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

  • 我也缺少第一行,产生了作者提到的错误! (2认同)

jpe*_*lli 14

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

这就是我解决问题的方法

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,/ bin/sh是"破折号"(不是bash)的链接,并且[[是bash语法糖度.所以我只是将链接替换为/ bin/bash.在你的系统中小心使用这样的rm!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
Run Code Online (Sandbox Code Playgroud)

  • 覆盖你的发行版的默认`sh`是不明智的恕我直言.用`sh`运行的shell应该与`dash`一起使用; 如果没有,那就是脚本中的错误.如果你需要`bash`功能,请使用`bash`,而不是`sh`. (5认同)
  • 这听起来很可怕 (3认同)
  • 我同意,这只是一个丑陋的解决方法。类似但更好的解决方法是使用 `update-alternatives`(在基于 debian-based-linux 中),如下所示 https://justinconover.wordpress.com/2012/05/14/ubuntu-changed-dash-to-bash/但最终,它会是一样的。 (2认同)

Ame*_*sse 10

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


Hat*_*zil 10

如果您知道自己正在使用 bash,但仍然收到此错误,请确保在 if 中写入空格。

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

[[ 1==1 ]] # OK
Run Code Online (Sandbox Code Playgroud)