bash脚本 - awk不处理作为正则表达式传递的变量

时间:2017-05-15 16:39:54

标签: bash variables awk

我正在写一个bash脚本。即使匹配,以下awk命令也不会打印任何内容。 我已经复制了awk行,当我用实际数据替换$ SEARCH_QUERY时,它在交互式shell中成功执行。这让我相信awk没有正确地翻译变量$ SEARCH_QUERY中的数据。 任何想法如何解决这个问题或者我应该阅读哪些bash主题,以了解它为什么不起作用?谢谢

search_contacts()
{
    echo "Enter contact Name:"
    read SEARCH_QUERY
    awk ' /$SEARCH_QUERY/ { print $0 }' contacts.db
}

1 个答案:

答案 0 :(得分:1)

为什么原始代码被破坏而言 - 单引号禁止参数扩展,因此awk$SEARCH_QUERY视为正则表达式本身,即。在结束后找到一个字符串SEARCH_QUERY 的行 - 一个可能无法匹配的正则表达式。

因此,天真的方法将改变引用类型,以便实际发生您的预期替换:

# THIS IS DANGEROUSLY INSECURE; DON'T DO THIS EVER
awk "/$SEARCH_QUERY/" contacts.db

但是,根据评论,以上是危险的不安全;如果您的SEARCH_QUERY值结束了正则表达式(包括/),那么它可以运行它想要的任意awk代码。 nonmatch/ || system("rm -rf ~") || /anything会做很糟糕的事情。

就最佳做法而言 - 数据应通过代码传递出来:

awk -v search_query="$SEARCH_QUERY" '$0 ~ search_query' contacts.db