什么时候在grep中使用单引号,双引号?


20

尝试在文件中搜索简单模式“ hello”时,以下所有形式的grep均起作用:

  • grep你好file1
  • grep'你好'file1
  • grep“你好” file1

是否存在上述表格中的一种有效而其他表格不起作用的特定情况。如果我用一个代替另一个会有所不同吗?

Answers:


25

这实际上取决于您的外壳。引号(两种)都主要用于处理空格。例如,以下内容:

grep hello world file1

将在名为“ world”和“ file1”的文件中查找单词“ hello”,而

grep "hello world" file1

将在文件1中查找“ hello world”。

仅当搜索字符串包含要评估的变量或其他项目时,单引号或双引号之间的选择才重要。用单引号引起来,字串按字面意义使用,并且不进行扩展。用双引号将变量扩展。例如(使用Bourne衍生的外壳,例如Bash或ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

第一个grep将在文件1中查找文字字符串“ $ VAR1”。第二个将扩展“ $ VAR”变量,并在文件1中查找字符串“ serverfault”。


需要注意的关键是,在原始问题中,grep实际上每次都接收完全相同的参数。
MikeyB 2011年

2
小心点 $在正则表达式中是行尾,因此$VAR1绝对不要匹配任何内容。它碰巧可以在GNU grep上工作,但是我仍然不指望这种行为。您需要\$VAR1安全地匹配文字字符串。(如果用双引号引起来,则需要额外的反斜杠。)
Steven Pritchard

7

James是正确的,但是要添加更多数据,我认为最好的考虑方式是作为命令的参数:您打算将“ hello”和“ world”作为两个参数,还是将“ hello world”作为一个参数?论点。

同样,双引号不仅可以解释变量。究竟是什么取决于您的Shell,但请检查历史记录扩展,大括号扩展和文件名扩展。

还需要注意的是,在某些情况下,您需要在单个参数中使用两种类型的引号。请记住,(默认情况下)参数由空格分隔,因此,如果不留任何空格,您仍将指定相同的参数。

大多数shell的单引号机制都不允许使用任何特殊字符,这意味着另一个单引号的任何实例(即使看起来已被转义)也将结束引号。因此,不可能在单引号字符串内传递带有单引号的字符串,而您必须使用双引号。当您想传递一个包含单引号和将被解释但又不想被解释的参数时,这可能会很痛苦。例如,如果您想传递文字字符串“''$ VAR'是一个变量”,则必须采用以下方式:

"'"'$VAR'"' is a variable"

这实际上是三个引号转义字符串的串联:

"'"
'$VAR'
"' is a variable"

或者,删除引号:

'
$VAR
' is a variable

实际上,对于大多数shell,您也可以这样进行:

"'\$VAR' is a variable"

反斜杠(“ \”)告诉shell接受字面上的以下字符,而不对其进行任何扩展。

但是在某些情况下,您最终不得不采用多字符串串联方式,而不是我现在可以实际提出一个示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.