【问题标题】:Bash: Using quoted variable for grep within quoted expressionBash:在带引号的表达式中为 grep 使用带引号的变量
【发布时间】:2015-04-21 00:17:46
【问题描述】:

我正在尝试在查询日志文件的 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": 没有这样的文件或目录
没有与搜索词匹配的行。

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

【问题讨论】:

    标签: regex linux bash shell grep


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。两种解决方案都很有效,但我更喜欢第二种。
    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 2022-08-12
    • 2010-09-18
    • 2020-01-09
    • 2011-10-20
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多