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

Posted

技术标签:

【中文标题】bash 中的字符串比较。 [[: 未找到【英文标题】:String comparison in bash. [[: not found 【发布时间】:2012-08-27 04:15:27 【问题描述】:

我正在尝试比较 bash 中的字符串。我已经在*** 上找到了如何操作的答案。在我正在尝试的脚本中,我正在使用 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

我还尝试了 ubuntuforums 的方法,您可以在第二篇文章中找到该方法

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

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

[[: not found

我做错了什么?

【问题讨论】:

我可能做错了,但使用单个方括号总是对我有用。 /bin/bash --version 打印什么? [ 在这种情况下不起作用,因为它不支持模式。 【参考方案1】:

[[ 是 bash 内置的。您的 /bin/bash 似乎不是真正的 bash。

来自评论:

在文件顶部添加#!/bin/bash

【讨论】:

如果我输入:输入 '[[' 我得到 [[ 是一个 shell 关键字 运行/bin/bash -c "type [["时是否得到相同的结果? 这件事发生在我身上,因为我忘记在文件顶部添加#!/bin/bash 发生在我身上,因为我用sh 运行脚本,很沮丧。现在我只需要在找到这个答案之前重做我撤消的所有事情。 我希望我能给你更多的支持...浪费了这么多时间。【参考方案2】:

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

$ sh myscript

你应该试试:

$ bash myscript

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

$ ./myscript

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

【讨论】:

我以这种方式被拒绝了权限。使用 sudo ./myscript 找不到它的命令 chmod +x myscript,然后再次运行,你不需要sudo 你是如何调用你的脚本的? 如你所说。通常我用'$sh myscipt.sh'来称呼它。第二次做 chmod +x myscript.sh 我用 ./myscript.sh 调用它 当您通过sh myscript.sh 运行脚本时会出现该错误,因为/bin/sh 模拟了[[ 不是内置函数的Bourne shell。但是,通过./script.sh 运行脚本不会产生错误,因为在这种情况下,shebang 应该会导致使用/bin/bash【参考方案3】:

是脚本的第一行:

#!/bin/bash

#!/bin/sh

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

【讨论】:

第一行也丢失了,因为我产生了作者提到的错误!【参考方案4】:

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

【讨论】:

用 Ubuntu 16.04 和 (sh ->) dash 0.5.8-2.1ubuntu2 检查了一下,发现 [ 与“-eq”等结合使用效果很好。可以在此处找到有关此上下文的比较运算符的类似信息:***.com/questions/10849297/… - 我进一步检查了下一个链接中推荐的 (( )) 评估运算符,但对于我的最小侵入性更改似乎失败了/或/它需要一个更深层次的代码更改。 softpanorama.org/Scripting/Shellorama/Control_structures/…【参考方案5】:

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

这就是我解决问题的方法

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

如您所见,/bin/sh 是指向“dash”(不是 bash)的链接,[[ 是 bash 语法糖度。所以我只是替换了 /bin/bash 的链接。 在你的系统中小心使用这样的 rm!

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

【讨论】:

为您的发行版覆盖默认的sh 恕我直言,这是不明智的做法。使用sh 运行的shell 应该使用dash;如果没有,那是脚本中的错误。如果您需要bash 功能,请使用bash,而不是sh 这听起来很糟糕 我同意,这只是一个丑陋的解决方法。一个类似但更好的解决方法是使用 update-alternatives(在基于 debian 的 linux 中)像这样 justinconover.wordpress.com/2012/05/14/… 但最后,它会是一样的。【参考方案6】:

如果您知道自己在使用 bash,但仍然出现此错误,请确保在 if 中使用空格。

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

[[ 1==1 ]] # OK

【讨论】:

【参考方案7】:

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

bash script.sh arg0 ... argn

【讨论】:

这为我修好了!【参考方案8】:

在终端中执行:

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

【讨论】:

以上是关于bash 中的字符串比较。 [[: 未找到的主要内容,如果未能解决你的问题,请参考以下文章

如何在Linux 系统上比较Bash 脚本中的字符串?

如何在 Python 函数结果中表示“未找到索引”

未找到 Bash 中的数组 [重复]

Java中的相似性字符串比较

如何在 Bash 中比较两个点分隔版本格式的字符串?

linux shell bash 内置变量参考