Bash:在引用的表达式中为grep使用带引号的变量

时间:2015-04-21 00:17:46

标签: regex linux bash shell grep

我试图在查询日志文件的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:don&#t; t":没有这样的文件或目录
没有符合搜索字词的行。

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

1 个答案:

答案 0 :(得分:3)

如果您意识到 $()被允许使用未转义的引号,那实际上非常简单:

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如何解析命令的更多信息。