bash/shell脚本中单引号与双引号有什么区别

单引号不会插入任何内容,但双引号会。例如:变量、反引号、某些\转义符等。

例子:

$ echo "$(echo "upg")"
upg

$ echo '$(echo "upg")'
$(echo "upg")

Bash 手册中有这样的说法:

3.1.2.2 单引号

将字符括在单引号 ( ') 中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

3.1.2.3 双引号

将字符括在双引号 ( ") 中会保留引号内所有字符的文字值,但启用历史扩展时的$`、和 除外。字符和在双引号内保留其特殊含义(请参阅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'!cmdANSI-C 引号内的历史扩展字符'!'被忽略

0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x