命令行上双引号“”,单引号“”和反引号“`”之间的区别?


43

我经常在网上看到教程或在此站点上发表文章,这些文章在命令行中大量使用以下字符。通常,它们似乎用于非常相似的目的。在命令行上使用或用于Shell编程时,它们之间有什么区别?我出于什么目的使用它们中的哪一个?

" " double quotes

' ' single quotes

` ` backticks

Answers:


43

为了举例说明,请考虑该变量foo包含unamefoo=uname)。

  • echo "$foo"输出uname,将变量替换为文本。
    • 对于引号$内的文字字符",请使用\$;。对于文字",使用\"
  • echo '$foo'输出$foo,确切的字符串。
    • 甚至'不能转义为\''引号。但是你可以使用'foo'\''bar'
  • echo `$foo`输出Linux,执行变量的内容并echo打印。

\即使将单引号括在单引号中,也始终按字面对待'。开盘后',下一个'总是解释为闭口报价。喜欢引用的东西'在单引号的字符串可以通过结束报价,逃逸实现'独立,并开始重新报价。也就是说,虽然\'在打开和关闭'字符之间'\''不起作用,但可以。(有关详细信息,我犯了同样的错误,请参阅Gilles 对我的一篇文章更正。)
Eliah Kagan 2014年

11

bash手册的相关部分对此进行了很好的解释。简而言之,单引号内的所有内容均按字面解释。因此,例如:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

将其与未引用的版本进行比较:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

双引号允许变量扩展(也可以扩展历史记录和其他功能)。基本上,您在处理要扩展的内容时会使用它们。例如:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

换句话说,单引号可以完全保护外壳中的字符串,而双引号可以保护某些内容(例如空格),但允许变量和特殊字符正确地扩展/解释。


1
不知道事实之后是否更改了OP,但是此答案未提及反引号?
亚历山大·米尔斯

5

单引号('')用于保留引号内每个字符的文字值。

使用双引号(""),保留所有封闭字符的文字值,但美元符号($),反引号(反引号``)和反斜杠(\)除外。

``外壳包含在反引号()中时,shell解释为“反引号内命令的输出”。这称为“命令替换”,因为命令的输出将替换命令本身。

参考资料:


3
echo '$HOME' is "$HOME"

单引号阻止变量扩展,而双引号允许变量扩展。


2

我只是一般地说,但是:

""-用于在输出之前处理其中的一些信息。(类似于PHP。)

  • 例如:name=NESS; echo "Hello my name is $name"将输出:Hello my name is NESS

''-用于按原样显示输出。(也类似于PHP。)

  • 使用上面的示例,它将输出 Hello my name is $name

因此,双引号和单引号之间的区别在于双引号处理变量并显示值,而单引号显示未经处理的变量名称。

`` -用于引用稍后分配给另一个变量的命令。


1

单引号包含一个从字面上看要取的值:禁止所有类型的扩展。通常使用的或如果该值包括可以包括空白(空格,制表符,新的线),或特殊字符($\`),该用户不希望被扩展/由shell特殊对待。

双引号括起来的值将具有变量,并且字符替换完成。当输出可能包含空格,并且必须将其分配为单个值时是必需的。

反引号包含一个命令,其结果需要作为值。较新的shell允许使用$(...)代替`...`。我喜欢较新的方法。

以下代码可以帮助您了解正在发生的事情。

CMD ='ls。'
回声sq:$ CMD
设置$ CMD
echo raw 1:$ 1
回声原始:$ *
设置“ $ CMD”
回声dq:$ 1
echo bq:`$ CMD`
回显新:$($ CMD)
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.