在if语句中使用带有变量的Bash通配符

7

我想根据这个方法在字符串中查找子字符串。

但是由于一些原因,它无法处理变量:

str="abcd";
substr="abc";
if [[ "${substr}"* == ${str} ]]
then
        echo "CONTAINS!";
fi

2
substr 必须在 == 之后。 - user4453924
1个回答

13
在参考手册的《条件结构》章节中,关于[[ ... ]]的文档,你会读到以下内容:

当使用==!=操作符时,操作数右侧的字符串被视为模式,并根据下面在模式匹配中描述的规则进行匹配,就像启用了extglob shell选项一样。

(强调是我的)。

因此你需要将你的通配符模式放置在==操作符右侧

if [[ $str == "$substr"* ]]; then

请注意,左侧不需要加引号,但是右侧的$substr部分需要加引号,以防它包含通配符,如*?[...]+(...)等。


这个救了我!我的问题是因为在检查变量 $str 时添加了引号。 - Harout360

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接