我曾经在命令行上互换使用''
and (单引号和双引号),但最近我注意到 ' ' 没有扩展,而 ' ' 是。我搜索了一下,发现允许""
'$HOME/some/dir'
"$HOME/some/dir"
""
一些保护特殊字符,同时''
允许全面保护。那么还有哪些其他字符受到保护''
,哪些不受到保护呢""
?
编辑:什么是实际的在什么情况下这些差异可能很显着?
答案1
查看 bash 手册页。有一整节都是关于引用的。因为这是根据 GFDL 授权的,与此处使用的 CC-BY-SA 许可证不兼容,所以我不会引用整个内容,但实际上阅读这就是最明确的答案。
总之,单引号停止所有解释——字符串按字面意思呈现。当后跟某些其他字符时,双引号将$
(美元符号)、`(反引号)保留为特殊,将(反斜杠)保留为特殊。如果启用了历史扩展功能(默认情况下),则会受到特殊对待\
。!
在实际使用中,这$
是一件大事,因为人们通常可能希望它能够实现各种扩展(变量等),同时仍然防止 shell 混淆大部分命令行。
答案2
虽然单引号保留它们所包含的所有字符的字面值,
双引号的不同之处在于它们不保留美元符号 $、反引号 - - 和反斜杠 , 的字面值。
当用双引号引起来时,美元符号和反引号保留其特殊含义,而反斜杠字符的特殊含义只有当它位于美元符号、反引号、双引号、反斜杠或换行符之前时才保留。
例子:
[user@localhost~]$ echo '$HOME'
$HOME
[user@localhost~]$ echo '`pwd`'
`pwd`
[user@localhost~]$ echo '"Hello world"'
"Hello world"
[user@localhost~]$ echo "$HOME"
/home/user
[user@localhost~]$ echo "`pwd`"
/home/user
[user@localhost~]$ echo ""Hello world""
Hello world
[user@localhost~]$ echo "\$HOME"
$HOME
[user@localhost~]$ echo "\`pwd\`"
`pwd`
[user@localhost~]$ echo "\"Hello ,world\""
"Hello, world"