在使用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.
为什么我会得到我所做的输出?
引用man bash,部分引用:
未加引号的反斜杠 (
\) 是转义字符。它保留了下一个字符的字面值,除了<newline>. 如果一\<newline>对出现,并且反斜杠本身没有被引用,则将\<newline>其视为行继续(即,它从输入流中删除并有效地忽略)。
这允许您将脚本中很长的命令/命令序列(管道和转换输出等)分成多行以提高可读性。
要让它按照您的预期处理换行符,只需将值(以及变量的任何后续使用)括在引号中。
$ A="B
> C"
$ echo "$A"
B
C
Run Code Online (Sandbox Code Playgroud)
来自同一部分:
将字符括在单引号中会保留引号内每个字符的字面值。...
用双引号将字符括起来会保留引号内所有字符的字面值,除了 $、`
\、 和,当启用历史扩展时,!。字符 $ 和 ` 在双引号内保留其特殊含义。反斜杠仅在后跟以下字符之一时保留其特殊含义:$、`、"\、 或 。
将“为什么”回答为“为什么这有用”:
反斜杠换行符用于续行以分割过长的行:
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)