bash 引用中的转义字符如何工作?

How does escape character work in bash quote?

通读Escape Character and Quotes sections

对于转义字符“”,它提到

It preserves the literal value of the next character that follows

单引号

' preserves the literal value of each character within the quotes

echo 'a\nb'
> a\nb
echo 'a\\nb'
> a\
> b

问题是:

  1. 为什么\不解释为字面意思,而是2个反斜杠在这里解释为一个\?

2.1 ANSI c standard中的所有序列是否保留为单个字符?

2.2 但下面的例子似乎与上述假设相矛盾

echo '\"'
> \"  # instead of printing ", it prints \"

' ' 引号之间没有转义序列的解释。写入

"\""

你得到了预期的行为。

ANSI 转义序列由 shell 解释,只有当您将它们环绕在 $'..' 周围而不是

'a\nb' 没有 ANSI 序列的情况下,它按字面意思被视为字符 a,后跟两个 \nb.仅在 ANSI 引用语法中它被特殊对待,即在 $'a\nb' 中,\n 被解释为换行符的特殊序列,但由于额外的转义阻止 \n 免于展开,使其按字面意思展开。

echo 'a\nb'
a\nb
echo $'a\nb'
a\nb

'a\\nb' 的情况是相同的,没有 ANSI 转义,内容按字面展开,但由于存在引号,序列 a\\nb 由 [=47= 解释] 为 \ 设置一个转义字符作为 \ 和一个 \n,因此它扩展为

echo $'a\\nb'
a\
b

是的,当 shell 扩展它时,ANSI 转义序列被视为单个字符。

并且 '\"' 中没有涉及转义序列扩展,单引号中的内容按字面意思保留

echo '\"'
\"
echo '"'
"

请注意,对于上述情况,使用 ANSI 引用会扩展 $'..',从而扩展任何可能的转义序列,因此 \" 仅扩展为 "

echo $'\"'
"

参考 - ANSI-C Quoting