何时在 grep 中使用单引号、双引号或不使用引号?

何时在 grep 中使用单引号、双引号或不使用引号?

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

  • grep hello 文件1
  • grep ‘你好’ 文件1
  • grep "你好" 文件1

是否存在上述表格之一有效但其他表格无效的特殊情况。如果我使用其中一种表格代替另一种表格,会有什么不同吗?

答案1

这实际上取决于您的 shell。引号(无论哪种)主要用于处理空格。例如,以下内容:

grep hello world file1

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

grep "hello world" file1

将在 file1 中寻找“hello world”。

仅当搜索字符串包含变量或其他您希望评估的项目时,单引号或双引号之间的选择才很重要。使用单引号时,字符串将按字面意思理解,不会进行扩展。使用双引号时,变量将被扩展。例如(使用 Bourne 派生的 shell,例如 Bash 或 ZSH):

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

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

答案2

詹姆斯是正确的,但是为了添加更多数据,我认为最好的思考方式是将其作为命令的参数:您是否打算将“hello”和“world”作为两个参数,还是将“hello world”作为单个参数。

此外,双引号允许解释的不仅仅是变量。具体是什么取决于你的 shell,但请检查历史扩展、括号扩展和文件名扩展。

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

大多数 shell 的单引号机制不允许使用任何特殊字符,这意味着任何另一个单引号的实例,即使它看起来是转义的,也会结束引号。因此,不可能在单引号字符串中传递带有单引号的字符串,而必须使用双引号。当您想要传递包含单引号和一些将被解释但您不想解释的内容的参数时,这可能会很麻烦。例如,如果您想传递文字字符串'$VAR' is a variable,则必须这样做:

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

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

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

或者,删除引号:

'
$VAR
' is a variable

实际上,对于大多数 shell,你也可以这样做:

"'\$VAR' is a variable"

...其中反斜杠(“ \”)告诉 shell 按字面意思接受以下字符,但不对其进行任何扩展。

但在某些情况下,你最终必须采用多字符串连接的方式来完成,而我现在实际上无法想出一个例子。

相关内容