我正在写一个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
}
答案 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