我正在尝试在查询日志文件的 bash 脚本中创建一个函数。在查询函数中,我有类似于以下内容的内容:
if [ -n "$(cat some-log-file.log | grep \"$1\")" ]; then
echo "There is a match."
else
echo "No lines matched the search term."
fi
如果我发送一些我知道会在日志文件中作为 $1 的内容,比如“我不这样做”,我会得到输出:
$ ./y.sh 查询“我不”
grep: 不要": 没有那个文件或目录
没有与搜索词匹配的行。
如果我尝试对 $() 表达式进行单引号,它会发送文字字符串并始终计算为真。我猜这与 grep 解释反斜杠的方式有关,但我无法弄清楚。也许我正在监督一些简单的事情,但我已经花了好几个小时在论坛上寻找并插入引号和转义字符的各种奇怪组合。感谢您提供任何帮助或建议。
最佳答案
如果您意识到 $()
允许使用未转义的引号,这实际上非常简单:
if [ -n "$(cat some-log-file.log | grep "$1")" ]; then
echo "There is a match."
else
echo "No lines matched the search term."
fi
不过,实际上您甚至可以跳过该步骤,因为 grep
提供了适当的退出代码:
if grep -q "$1" some-log-file.log; then
echo "There is a match."
else
echo "No lines matched the search term."
fi
简而言之,发生这种情况的原因与 "$1"
起作用的原因相同:Shell 参数扩展和命令替换发生在 单词拆分和引号删除之前。在 Shell Expansions section of the bash manual 中查看有关 bash 如何解析命令的更多信息.
关于regex - Bash:在引用表达式中对 grep 使用引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29760690/