单引号不会插入任何内容,但双引号会。例如:变量、反引号、某些\
转义符等。
例子:
$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")
Bash 手册中有这样的说法:
将字符括在单引号 (
'
) 中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。将字符括在双引号 (
"
) 中会保留引号内所有字符的文字值,但启用历史扩展时的$
、`
、和 除外。字符和在双引号内保留其特殊含义(请参阅Shell 扩展)。反斜杠仅在后跟以下字符之一时才保留其特殊含义:、、、或换行符。在双引号中,后跟这些字符之一的反斜杠将被删除。前面没有特殊含义的字符的反斜杠保持不变。可以在双引号内通过在双引号前面加上反斜杠来引用双引号。如果启用,则将执行历史扩展,除非使用反斜杠对双引号中出现的进行转义。 前面的反斜杠不会被删除。\
!
$
`
$
`
"
\
!
!
特殊参数
*
和@
在双引号中具有特殊含义(参见Shell 参数扩展)。
这是个单引号与双引号对照表
假设
a=apple # a simple variable
arr=(apple) # an indexed array with a single element
# | 表达 | 结果 | 评论 |
---|---|---|---|
1 | "$a" | apple | 变量在内部扩展"" |
2 | '$a' | $a | 变量不在内部扩展'' |
3 | "'$a'" | 'apple' | '' 里面没有特殊含义"" |
4 | '"$a"' | "$a" | "" 在内部按字面意思处理'' |
5 | '\'' | 无效的 | 无法逃脱' ;'' 使用"'" 或$'\'' (ANSI-C 引用) |
6 | "red$arocks" | red | $arocks 不扩大$a ;用于${a}rocks 保存$a |
7 | "redapple$" | redapple$ | $ 后面没有变量名,计算结果为$ |
8 | '\"' | \" | \ 里面没有特殊含义'' |
9 | "\'" | \' | \' 在内部解释"" ,但对' |
10 | "\"" | " | \" 在内部解释"" |
11 | "*" | * | glob 在内部不起作用"" 或'' |
12 | "\t\n" | \t\n | \t 并且在或\n 内部没有特殊含义;使用 ANSI-C 引用"" '' |
十三 | "`echo hi`" | hi | `` 并$() 在内部进行评估"" (反引号保留在实际输出中) |
14 | '`echo hi`' | `echo hi` | `` 并且$() 不在内部进行评估'' (反引号保留在实际输出中) |
15 | '${arr[0]}' | ${arr[0]} | 无法在内部进行数组访问'' |
16 | "${arr[0]}" | apple | 数组访问在内部工作"" |
17 | $'$a\'' | $a' | 单引号可以在 ANSI-C 引用中转义 |
18 | "$'\t'" | $'\t' | ANSI-C 引用不被解释"" |
19 | '!cmd' | !cmd | 历史扩展字符'!' 被忽略'' |
20 | "!cmd" | cmd args | 扩展到最近匹配的命令"cmd" |
21 | $'!cmd' | !cmd | ANSI-C 引号内的历史扩展字符'!' 被忽略 |