Bash: 在引用表达式中对 grep 使用引用变量

Bash: Using quoted variable for grep within quoted expression

我正在尝试在查询日志文件的 bash 脚本中创建一个函数。在查询函数中,我有类似于以下内容的内容:

if [ -n "$(cat some-log-file.log | grep \"\")" ]; then
  echo "There is a match."
else
  echo "No lines matched the search term."
fi

如果我发送一些我知道会在日志文件中作为 $1 的东西,比如 "I don't",我得到输出:

$ ./y.sh 查询 "I don't"
grep: 不要": 没有那个文件或目录
没有与搜索词匹配的行。

如果我尝试对 $() 表达式进行单引号,它会发送文字字符串并始终计算为真。我猜这与 grep 解释反斜杠的方式有关,但我无法弄清楚。也许我正在监督一些简单的事情,但我已经花了好几个小时在论坛上寻找并插入引号和转义字符的各种奇怪组合。感谢任何帮助或建议。

其实很简单,如果你意识到 $() 允许有未转义的引号:

if [ -n "$(cat some-log-file.log | grep "")" ]; then
  echo "There is a match."
else
  echo "No lines matched the search term."
fi

不过,实际上您甚至可以跳过该步骤,因为 grep 给出了适当的退出代码:

if grep -q "" some-log-file.log; then
  echo "There is a match."
else
  echo "No lines matched the search term."
fi

简而言之,发生这种情况的原因与 "" 相同:Shell 参数扩展和命令替换发生在 之前 分词和引号删除。在 Shell Expansions section of the bash manual.

中查看有关 bash 如何解析命令的更多信息