ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试比较 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

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

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

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

[[: not found

我究竟做错了什么?

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

A
Abhay

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

来自评论:

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


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

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

$ 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
K
Kevin

是脚本中的第一行:

#!/bin/bash

或者

#!/bin/sh

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


我也缺少第一行,因为我产生了作者提到的错误!
E
Etienne Gautier

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

if [ $MYVAR = "myvalue" ]; then
    echo "true"
else
    echo "false"
fi

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

我在安装 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-based-linux 中)像 justinconover.wordpress.com/2012/05/14/… 一样,但最终,它会是相同的。
R
Richard Miller

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

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

[[ 1==1 ]] # OK

S
Smeterlink

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

bash script.sh arg0 ... argn


这为我修好了!
A
Antonio Moreno

在您的终端中执行:

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