Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash:在带引号的表达式中为grep使用带引号的变量_Regex_Linux_Bash_Shell_Grep - Fatal编程技术网

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

Regex Bash:在带引号的表达式中为grep使用带引号的变量,regex,linux,bash,shell,grep,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:

我试图在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解释反斜杠的方式有关,但我不明白。也许我在监督一些简单的事情,但我已经在论坛上花了几个小时寻找并插入各种奇怪的引号和转义字符组合。有没有非常感谢您的帮助或建议。

如果您意识到
$()
允许使用未替换的引号,那么这其实很容易:

实际上,您甚至可以跳过该步骤,因为
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参数扩展和命令替换发生在单词拆分和引号删除之前。有关bash如何在中解析命令的详细信息,请参阅。

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

实际上,您甚至可以跳过该步骤,因为
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参数扩展和命令替换发生在单词拆分和引号删除之前。有关bash如何在中解析命令的详细信息,请参阅。

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

实际上,您甚至可以跳过该步骤,因为
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参数扩展和命令替换发生在单词拆分和引号删除之前。有关bash如何在中解析命令的详细信息,请参阅。

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

实际上,您甚至可以跳过该步骤,因为
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参数扩展和命令替换发生在分词和删除引号之前。在中查看有关bash如何解析命令的更多信息。

非常感谢。两种方法都很有效,但我倾向于第二种。非常感谢。两种方法都很有效,但我倾向于第二种。非常感谢。两种方法都很有效,但我倾向于第二种。非常感谢。两种解决方案都很有效,但我倾向于第二种。