2

我正在做 bash ,我尝试测试给定变量 x 中的子字符串“world”是否。我有一部分代码工作。但另一个不工作。我想弄清楚为什么

第一个正在工作

x=helloworldfirsttime
world=world
if [[ "$x"  == *$world* ]];then
    echo matching helloworld

第二个不工作

x=helloworldfirsttime
if [[ "$x"  == "*world*" ]];then
    echo matching helloworld

如何在不使用像第一种方法这样的变量的情况下使第二个工作

有人可以帮我修第二个吗。。谢谢

4

4 回答 4

6

只需删除引号:

x=helloworldfirsttime
if [[ "$x" == *world* ]]; then
    echo matching helloworld
fi

请注意,这不是正则表达式(这个正则表达式看起来像.*world.*)。bash 中的模式匹配在此处描述:
http ://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html

于 2013-09-10T23:49:43.860 回答
3
x=helloworldfirsttime
$ if [[ "$x" == *world* ]]; then echo MATCHING; fi
MATCHING

这是因为 bash 的内置[[运算符将测试的右侧==视为一种模式:

使用==and!=运算符时,将运算符右侧的字符串用作模式并执行模式匹配。

于 2013-09-10T23:51:13.140 回答
0

下次如果你想为模式提供空格,你可以在""or周围引用它'',只是你必须将模式字符放在外面:

[[ "$x"  == *"hello world"* ]]

[[ "$x"  == *'hello world'* ]]

[[ "$x"  == *"$var_value_has_spaces"* ]]
于 2013-09-11T07:59:29.260 回答
0

你应该使用没有引号和=~运算符。

TEXT=helloworldfirsttime
SEARCH=world
if [[ "$TEXT" =~ .*${SEARCH}.* ]]; then echo MATCHING; else echo NOT MATCHING; fi
TEXT=hellowor_ldfirsttime
if [[ "$TEXT" =~ .*${SEARCH}.* ]]; then echo MATCHING; else echo NOT MATCHING; fi
于 2018-11-26T16:57:50.467 回答