首页 > 解决方案 > 如何在 bash 中插入动态匹配模式?

问题描述

我正在查看此链接检查 Bash 数组是否包含一个值,该值说明如何检查列表中是否存在项目,如下所示:

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

解决方案


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

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

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

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


推荐阅读