在 Linux shell 中,为什么反斜杠换行符不引入空格?

use*_*279 8 linux bash shell

在使用Linux shell时,我遇到了以下情况:

$ A=B\
> C
$ echo $A
BC
Run Code Online (Sandbox Code Playgroud)

在我看来,当换行符遇到转义字符时,它不能是 CR 字符,但它仍然是换行符。该echo $A应解释为echo B newline C和换行应该是一个IFS echo。所以输出应该是B C而不是BC.

为什么我会得到我所做的输出?

Dan*_*eck 9

引用man bash,部分引用

未加引号的反斜杠 ( \) 是转义字符。它保留了下一个字符的字面值,除了<newline>. 如果一\<newline>对出现,并且反斜杠本身没有被引用,则将\<newline>其视为行继续(即,它从输入流中删除并有效地忽略)。

这允许您将脚本中很长的命令/命令序列(管道和转换输出等)分成多行以提高可读性。


要让它按照您的预期处理换行符,只需将值(以及变量的任何后续使用)括在引号中。

$ A="B
> C"
$ echo "$A"
B
C
Run Code Online (Sandbox Code Playgroud)

来自同一部分:

将字符括在单引号中会保留引号内每个字符的字面值。...

用双引号将字符括起来会保留引号内所有字符的字面值,除了 $、` \、 和,当启用历史扩展时,!。字符 $ 和 ` 在双引号内保留其特殊含义。反斜杠仅在后跟以下字符之一时保留其特殊含义:$、`、" \、 或 。


Vol*_*gel 6

将“为什么”回答为“为什么这有用”:

反斜杠换行符用于续行以分割过长的行:

shell 脚本中行尾的反斜杠会使 shell 在执行脚本时忽略换行符。这通常用于将脚本文件中的长行拆分为多个文本行,这些文本行将由 shell 作为单个脚本行处理。

例如,命令

git log --tags --branches HEAD FETCH_HEAD ORIG_HEAD --graph --decorate --pretty=oneline --simplify-by-decoration
Run Code Online (Sandbox Code Playgroud)

可以写成

git log --tags --branches HEAD FETCH_HEAD ORIG_HEAD \
    --graph --decorate --pretty=oneline --simplify-by-decoration
Run Code Online (Sandbox Code Playgroud)