根据GNU 文档,
仅当后跟以下字符之一时,反斜杠才保留其特殊含义:'$'、'`'、'"'、'\' 或换行符。在双引号内,后跟这些字符之一的反斜杠将被删除。
我试过
p="a\$b";echo $p # a$b
p="a\`b";echo $p # a`b
p="a\"b";echo $p # a"b
p="a\\b";echo $p # a\b
一切都好。但换行?
p="a\newlineb";echo $p # a\newlineb
文档中的换行符是什么意思?
答案1
Newline是换行符的名称,即通常\n
在C中写成的字符:
$ p="a\
b"; echo "$p"
ab
结果是ab
而不是\a<newline>b
因为POSIX 标准说:
未加引号的A
<backslash>
应保留后续字符的字面值,但 a 除外<newline>
。如果 a<newline>
跟随在 shell 后面,则<backslash>
shell 会将其解释为行继续。在<backslash>
将<newline>
输入拆分为标记之前应删除and 。由于转义符<newline>
被完全从输入中删除并且不被任何空格替换,因此它不能用作标记分隔符。
但字符串是用双引号引起来...嗯,这是一个特殊情况:
<backslash>
仅当被视为特殊时,仅当后跟以下字符之一时, 才应保留其作为转义字符的特殊含义 :$
,`
,"
,\
,<newline>
。
因此,双引号字符串意味着反斜杠换行符被解释为就好像它是不是完全被引用,这意味着它充当行继续,并且反斜杠和换行符都被删除。
请注意,这是在您分配给p
变量时发生的,而不是在您echo
分配变量时发生的。
也可以看看忘记在 bash/POSIX shell 中引用变量的安全隐患关于引用变量的必要性,始终如此。