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

iezvtpos  于 2023-01-26  发布在  Shell
关注(0)|答案(9)|浏览(173)

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

我哪里做错了?

8xiog9wr

8xiog9wr1#

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

  • 来自评论:*

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

dwthyt8l

dwthyt8l2#

你的剧本是怎么写的?如果你写了

$ sh myscript

您应该尝试:

$ bash myscript

或者,如果脚本可执行:

$ ./myscript
  • sh* 和 bash 是两个different shells。在第一种情况下,您将脚本作为参数传递给sh解释器,而在第二种情况下,您将在第一行决定使用哪个解释器。
qeeaahzv

qeeaahzv3#

是脚本中的第一行:

#!/bin/bash

#!/bin/sh

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

zaq34kh6

zaq34kh64#

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

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

hjzp0vay5#

我在安装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
q9rjltbz

q9rjltbz6#

如果您知道自己正在使用bash,但仍然得到这个错误,请确保在if中使用空格。

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

[[ 1==1 ]] # OK
0s0u357o

0s0u357o7#

运行脚本时指定bash而不是sh,我个人注意到它们在ubuntu12.10下是不同的:
bash script.sh arg0 ... argn

lqfhib0f

lqfhib0f8#

在您的终端中执行:

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

wko9yo5t9#

将文件设置为可执行文件,然后不使用sh执行。
1.通过$ chmod +x文件名使其可执行
1.则使用./filename代替sh文件名

相关问题