\
<backslash>
仅当后跟以下字符之一时,应保留其作为转义字符的特殊含义(请参阅转义字符(反斜杠) )当被认为是特殊的:
$
`
"
\
<newline>
我将此解释为\
仅应转义这五个特殊字符之一(如果它在给定上下文中特殊的话)。
ash、dash、bash 和 ksh 的手册页不包含“当被认为特殊时”条款。我认为这意味着(并通过基本实验证实)\
具有无条件转义这五个字符的效果,即使这五个字符之一在其给定上下文中并不特殊。
考虑 的输出$ printf '%s\n' "\abcde"
,即\abcde
。这是预期的,因为a
在这种情况下(或与此相关的任何情况下)并不特殊;因此\
并不特殊,按字面意思处理。
现在考虑 的输出$ printf '%s\n' "\\abcde"
,即\abcde
。这不是我期望的行为。在我看来,字符串中的第一个反斜杠\\abcde
也应该按字面意思处理,因为它后面跟着的\
上下文中\
并不特殊。我期望的输出是\\abcde
.
我看到意外行为的另一个场景是在 的输出中$ printf '%s\n' "ab\$"
,即ab$
.在我看来,$
在这种情况下确实有特殊的含义,因为它确实有助于引入参数扩展、命令替换或算术扩展。因此,在我看来,\
应该按字面意思对待,因为它后面跟着的$
上下文$
并不特殊。我期望的输出是ab\$
.
根据记录,我希望我在这里完全没有根据。这让我的生活变得更加困难,不得不担心仅在某些情况下才能逃脱这五个角色。我努力尽可能做到 posixly 正确,并且\
如果主流 POSIX 兼容 shell 中的这种(个人期望的)行为不符合 POSIX,我不想无条件地依赖于转义这五个特殊字符。
答案1
答案2
echo "\abc\$\\"
(例如)涉及两个步骤。
首先,由于 的字符串参数echo
是双引号引起来的,因此 shell 将对其中的转义字符进行处理。
在这种情况下,"\abc\$\\"
会将其转换为\abc$\
之前将其传递给echo
。由于不是“特殊”字符之一,因此遗嘱\a
保持不变。a
其他转义字符将是文字,这意味着它们在 shell 中不再具有特殊含义( 不会$
启动扩展,反斜杠不会转义下一个字符等。)请注意,$
双引号字符串末尾的 an 仍然是“特殊”因为它可以引入了扩展,但字符串没有在其后立即结束。两个字符串"a$"
和"a\$"
是相同的,因为$
第一个字符串中的 不应用于任何内容。
然后,echo
可以对该字符串参数进行自己的解释。例如,的一些实现echo
将被视为表示“响铃字符”。\a
我还认为您误读了这里的标准。反斜杠后跟特殊字符之一的评估将消除反斜杠。您似乎认为它应该保持不变,并且\$
应该保留为\$
。该标准规定对面的的。