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
sh 和 bash 是两个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 中的字符串比较。 [[: 未找到的主要内容,如果未能解决你的问题,请参考以下文章