我正在做bash,我尝试测试给定变量x中的子串“world”。我有部分代码工作。但另一个不工作。我想弄明白为什么
第一个正在运作
x=helloworldfirsttime
world=world
if [[ "$x" == *$world* ]];then
echo matching helloworld
第二个不起作用
x=helloworldfirsttime
if [[ "$x" == "*world*" ]];then
echo matching helloworld
如何在不使用第一种方法的变量的情况下使第二种工作
有人可以为我修复第二个..谢谢
答案 0 :(得分:4)
只需删除引号:
x=helloworldfirsttime
if [[ "$x" == *world* ]]; then
echo matching helloworld
fi
请注意,这不是正则表达式(正则表达式类似于.*world.*
)。这里描述了bash中的模式匹配:
http://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html
答案 1 :(得分:3)
x=helloworldfirsttime
$ if [[ "$x" == *world* ]]; then echo MATCHING; fi
MATCHING
这是有效的,因为bash的内置[[
运算符将==
测试的右侧视为模式:
当使用
==
和!=
运算符时,运算符右侧的字符串将用作模式并执行模式匹配。
答案 2 :(得分:0)
下次如果您想提供带空格的图案,您可以在""
或''
周围引用它,只需要将图案字符放在外面:
[[ "$x" == *"hello world"* ]]
[[ "$x" == *'hello world'* ]]
[[ "$x" == *"$var_value_has_spaces"* ]]
答案 3 :(得分: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