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

NES*_*NES 46 command-line bash

我经常在网上看到教程或本网站上的帖子,这些教程在命令行中大量使用了以下字符。通常,它们似乎用于非常相似的目的。它们在命令行或shell编程中使用时有什么区别?我出于什么目的使用它们中的哪一个?

" " double quotes

' ' single quotes

` ` backticks
Run Code Online (Sandbox Code Playgroud)

she*_*lic 48

例如,考虑变量foo包含uname( foo=uname)。

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


ter*_*don 11

这在 bash 手册的相关部分中有很好的解释。简而言之,单引号内的任何内容都按字面解释。因此,例如:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}
Run Code Online (Sandbox Code Playgroud)

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

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3
Run Code Online (Sandbox Code Playgroud)

双引号允许变量扩展(还有历史扩展和其他一些东西)。基本上,您在处理想要扩展的内容时使用它们。例如:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash
Run Code Online (Sandbox Code Playgroud)

换句话说,单引号完全保护字符串不受 shell 影响,而双引号保护某些内容(例如空格),但允许正确扩展/解释变量和特殊字符。


ane*_*hep 5

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

使用双引号 ( "") 时,除了美元符号 ( $)、反引号(向后单引号``)和反斜杠 ( \)之外,所包含的所有字符的字面值都将保留。

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

参考: