无法理解bash双引号中的反斜杠换行符

use*_*964 1 shell bash

根据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
Run Code Online (Sandbox Code Playgroud)

一切正常。但是换行??

p="a\newlineb";echo $p  # a\newlineb
Run Code Online (Sandbox Code Playgroud)

文档中的换行符是什么意思?

Kus*_*nda 5

换行符是换行符的名称,即通常写成\nC中的字符:

$ p="a\
b"; echo "$p"
ab
Run Code Online (Sandbox Code Playgroud)

结果ab不是\a<newline>b因为POSIX 标准说

<backslash>未引用的A应保留以下字符的字面值,但 a 除外<newline>。如果 a<newline>跟在<backslash>shell后面,则外壳应将此解释为行继续。在<backslash><newline>应拆分之前被删除的输入令牌。由于转义<newline>字符完全从输入中删除并且没有被任何空格替换,因此它不能用作标记分隔符。

但是字符串用双引号引用的……嗯,这是一个特例:

<backslash>其后只有当在考虑特殊以下字符中的一个将保留它的特殊含义作为转义字符: $`"\<newline>

所以双引号字符串意味着反斜杠换行符被解释为好像它根本没有被引用,这意味着它充当行继续符并且反斜杠和换行符都被删除。

请注意,这是在您分配给p变量时发生的,而不是在您分配变量时发生echo

另请参阅忘记在 bash/POSIX shell中引用变量的安全隐患,了解引用变量的必要性,始终。