我正在查看此链接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。
您能不能像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
的值开头的行。
单引号是错误的;您想要双引号而不是单引号。
但是,grep -P
在这里也略有错误;它不能适当移植,并且您的模式未使用-P
启用的任何语法;另外,您应该正确引用数组。
if printf '%s\n' "${myarray[@]}" |
grep -q "^$mypattern\$"
then
...
单引号之间的文本逐字传递。如果要外壳程序执行变量插值,请使用双引号(然后需要转义任何文字反斜杠,美元符号或反引号)。