Answers:
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
换句话说,单引号可以完全保护外壳中的字符串,而双引号可以保护某些内容(例如空格),但允许变量和特殊字符正确地扩展/解释。
单引号(''
)用于保留引号内每个字符的文字值。
使用双引号(""
),保留所有封闭字符的文字值,但美元符号($
),反引号(反引号``
)和反斜杠(\
)除外。
当``
外壳包含在反引号()中时,shell解释为“反引号内命令的输出”。这称为“命令替换”,因为命令的输出将替换命令本身。
参考资料:
单引号包含一个从字面上看要取的值:禁止所有类型的扩展。通常使用的或如果该值包括可以包括空白(空格,制表符,新的线),或特殊字符($
,\
,`
),该用户不希望被扩展/由shell特殊对待。
双引号括起来的值将具有变量,并且字符替换完成。当输出可能包含空格,并且必须将其分配为单个值时是必需的。
反引号包含一个命令,其结果需要作为值。较新的shell允许使用$(...)
代替`...`
。我喜欢较新的方法。
以下代码可以帮助您了解正在发生的事情。
CMD ='ls。' 回声sq:$ CMD 设置$ CMD echo raw 1:$ 1 回声原始:$ * 设置“ $ CMD” 回声dq:$ 1 echo bq:`$ CMD` 回显新:$($ CMD)
\
即使将单引号括在单引号中,也始终按字面对待'
。开盘后'
,下一个'
总是解释为闭口报价。喜欢引用的东西'
在单引号的字符串可以通过结束报价,逃逸实现'
独立,并开始重新报价。也就是说,虽然\'
在打开和关闭'
字符之间'\''
不起作用,但可以。(有关详细信息,我犯了同样的错误,请参阅Gilles 对我的一篇文章的更正。)