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
问题是:
- 为什么\不解释为字面意思,而是2个反斜杠在这里解释为一个\?
2.1 ANSI c standard中的所有序列是否保留为单个字符?
2.2 但下面的例子似乎与上述假设相矛盾
echo '\"'
> \" # instead of printing ", it prints \"
在 ' '
引号之间没有转义序列的解释。写入
"\""
你得到了预期的行为。
ANSI 转义序列由 shell 解释,只有当您将它们环绕在 $'..'
周围而不是
在 'a\nb'
没有 ANSI 序列的情况下,它按字面意思被视为字符 a
,后跟两个 \
、n
和 b
.仅在 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
通读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
问题是:
- 为什么\不解释为字面意思,而是2个反斜杠在这里解释为一个\?
2.1 ANSI c standard中的所有序列是否保留为单个字符?
2.2 但下面的例子似乎与上述假设相矛盾
echo '\"'
> \" # instead of printing ", it prints \"
在 ' '
引号之间没有转义序列的解释。写入
"\""
你得到了预期的行为。
ANSI 转义序列由 shell 解释,只有当您将它们环绕在 $'..'
周围而不是
在 'a\nb'
没有 ANSI 序列的情况下,它按字面意思被视为字符 a
,后跟两个 \
、n
和 b
.仅在 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