如何在bash中插入动态匹配模式?

问题描述 投票:0回答:2

我正在查看此链接Check if a Bash array contains a value,该链接说如何检查列表中某项的存在,如下所示:

if printf '%s\n' ${myarray[@]} | grep -q -P '^mypattern$'; then
    # ...
fi

但是,我希望按以下方式将mypattern值作为变量传递:

mynewpattern="xyz"

当时我期望以下方法能正常工作

if printf '%s\n' ${myarray[@]} | grep -q -P '^"$mynewpattern"$'; then
    # ...
fi

但是它没有选择xyz的新模式。插入新模式的合适语法是什么?

我刚刚开始学习bash。

bash
2个回答
0
投票

您能不能像grep -q -P "^$var$"(in your script)那样使用这是一个针对Input_file的相同场景的示例脚本(因为未提供数组元素的示例,因此请在此处使用示例/示例脚本对其进行解释)。

##Shell variable
var="bla"

##A sample Input_file
cat << EOF > Input_file
blabla test test
123abcd123test
EOF

##Following is the code to check.
if grep -q -P "^$var" Input_file
then
     echo "match found."
fi

上面仅匹配以变量val的值开头的行。


0
投票

单引号是错误的;您想要双引号而不是单引号。

但是,grep -P在这里也略有错误;它不能适当移植,并且您的模式未使用-P启用的任何语法;另外,您应该正确引用数组。

if printf '%s\n' "${myarray[@]}" |
    grep -q "^$mypattern\$"
then
    ...

单引号之间的文本逐字传递。如果要外壳程序执行变量插值,请使用双引号(然后需要转义任何文字反斜杠,美元符号或反引号)。

© www.soinside.com 2019 - 2024. All rights reserved.