\
仅当被认为是特殊<backslash>
的以下字符之一时,才应保留其作为转义字符的特殊含义(请参阅转义字符(反斜杠)):
$
`
"
\
<newline>
我将此解释为意味着\
如果这五个特殊字符中的一个在其给定上下文中是特殊的,则它应该只转义它。
The man pages for ash, dash, bash and ksh do not contain the clause "when considered special". I take this to mean (and have confirmed through basic experimentation) that \
has the effect of escaping these five characters unconditionally, even when one of these five characters is not special in its given context.
Consider the output of $ printf '%s\n' "\abcde"
, which is \abcde
. This is expected because a
is not special in this context (or any context for that matter); therefore the \
is not special and is treated literally.
现在考虑 的输出$ printf '%s\n' "\\abcde"
,即\abcde
。这不是我所期望的行为。在我看来,字符串中的第一个反斜杠\\abcde
也应该按字面意思对待,因为在不特殊\
的上下文中紧随其后。\
我期望的输出是\\abcde
.
我看到意外行为的另一种情况是在 的输出中$ printf '%s\n' "ab\$"
,即ab$
. 在我看来,$
在这种情况下确实具有特殊含义,因为它确实用于引入参数扩展、命令替换或算术扩展。因此,在我看来,\
应该按字面意思对待,因为它在不特殊$
的上下文中紧随其后。$
我期望的输出是ab\$
.
为了记录,我希望我完全不在这儿。这让我的生活变得更加困难,不得不担心只有在某些情况下才能逃脱这五个角色。\
我努力尽可能地正确,如果主流 POSIX 兼容 shell 中的这种(个人希望的)行为不符合 POSIX ,我不想依赖于无条件转义这五个特殊字符。
本注释建议在考虑特殊时删除文本。
注:0000998 中有一组建议的更正。
该说明还报告说,该变更已于 2012 年 8 月 30 日获得批准。
我无法说明为什么现在的措辞中仍然使用它。
我相信你可以忘记那些话。
echo "\abc\$\\"
(例如)涉及两个步骤。首先,由于字符串参数
echo
是双引号,shell 将对其中的转义字符进行处理。在它的情况下,
"\abc\$\\"
它会在将其转换为\abc$\
之前将其交给echo
. 将\a
保持不变,因为a
它不是“特殊”字符之一。其他转义字符将是literal,这意味着它们在 shell 中不再具有特殊含义($
不开始扩展,反斜杠不转义下一个字符等)请注意,$
在 double 的末尾带引号的字符串仍然是“特殊的”,因为它可能引入了扩展,如果字符串没有在它之后结束。这两个字符串"a$"
和"a\$"
是相同的,因为$
第一个字符串中的 没有应用于任何东西。然后,
echo
可以对该字符串参数进行自己的解释。例如,某些实现echo
会认为\a
是“铃铛字符”的意思。我也认为你在这里误读了标准。反斜杠后跟特殊字符之一的评估将删除反斜杠。您似乎认为它应该保持不变并且 eg
\$
应该保留为\$
. 标准说的恰恰相反。