Bash中的行尾(换行符)转义字符

21

转义字符(\)可以用于转义行末,例如:

echo This could be \
a very \
long line\!

输出:

This could be a very long line!

然而,换行符(new line)不是由两个字符\n表示的吗?那么转义的结果不应该是字面上的\n吗?例如:

echo $'\\n'

输出:

\n

我不是想要回显一个新行。我想知道为什么\可以代表一个有两个字符的新行符(\n),而不是只是转义新行符中的反斜杠并产生\n的字面值。


1
http://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting - glenn jackman
10
嗯,我还不确定我是否理解您的问题。也许了解\n不是真正的换行符会有所帮助——它是一种转义序列,表示换行符(在Linux中只是一个字符)。行末的\ 转义了您使用enter键键入的实际换行符。 - Markku K.
不客气。有时候当你不知道自己不知道什么的时候,很难提出一个有意义的问题 :) - Markku K.
1
作为对@MarkkuK.评论的技术补充,您可以在ASCII表上看到换行/换行符是单个ASCII值(10)。 - ajp15243
1
@MarkkuK。您应该将您的评论变成答案,这样OP就可以接受它了。 - Ansgar Wiechers
显示剩余2条评论
2个回答

28

实际上,\n并不是一个真正的换行符号——它是一个转义序列,用来表示Linux中的一个换行符(在Linux中仅由一个字符表示)。一行末尾的\可以转义你使用回车键输入的实际换行符。你可以使用hexdump查看ASCII值代表不同字符:

%echo $'\\n'
\n
%echo $'\\n' | hexdump -C
00000000  5c 6e 0a                   |\n.|
00000003
你会注意到echo打印出了3个字符:\(5c),n(6e)和一个换行符(0a)。你还会注意到在hexdump输出的右侧,换行符显示为“.”,因为它被认为是不可打印字符

接近正确,但是如果你避免重复使用 \ 并在 echo 中包含 -n 参数以避免隐式换行符,则会得到一个换行符。echo -n $'\n' | hexdump -C结果为:00000000 0a |.| 00000001 - Aaron Robson
所以\n转义了n的字面意思,而\<Enter>转义了<Enter>的字面意思,也就是换行符? - undefined

1
在UNIX世界中,换行是指结束文件(或终端)中一行的字符的名称。在UNIX/Linux世界中,这对应于ASCII换行符字符。
不同的系统使用不同的约定来结束行:Windows使用回车和换行序列,而Mac最初使用单个回车符。这种混淆源于这些最初是需要移动打印机打印头到新行开头的命令。
在代码中,\n是表示行结束字符的常规方式,再次源于UNIX世界,更确切地说是C语言。请注意,在读取文本文件时,即使在这是一个两个字符序列的系统上,C也只读取单个换行符字符。

在UNIX中,如果换行符是2个字符,C语言(或更准确地说是fread函数)将读取2个字符。在Windows中,如果文件以文本文件打开,库将把\r\n序列转换为\n。否则即使在Windows中也将读取2个字符。 - martinkunev
在UNIX中,换行符是一个字符的定义,它是ASCII换行符或其他字符集中对应的字符。事实上,连续的换行符和回车符序列会按照原样读取,不进行翻译。 - Nicola Musatti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接