在 bash 中,当我写下这一行时
new_line="new\nline"
Run Code Online (Sandbox Code Playgroud)
我按预期得到这个:
echo $new_line
new\nline
Run Code Online (Sandbox Code Playgroud)
这也按预期工作:
echo -e $new_line
new
line
Run Code Online (Sandbox Code Playgroud)
正如手册中所说:-e enable interpretation of backslash escapes
但是,这并没有给我一个解释的\n
换行符:
cur_log=$(who)
echo -e $cur_log
myuser pts/0 2017-01-19 07:10 (:0) myuser pts/1 2017-01-19 09:26 (:0) myuser pts/4 2017-01-19 09:14 (:0)
Run Code Online (Sandbox Code Playgroud)
我认为没有换行符,但如果我写:
echo "$cur_log"
Run Code Online (Sandbox Code Playgroud)
我得到解释的换行符。
myuser pts/0 2017-01-19 07:10 (:0)
myuser pts/1 2017-01-19 09:26 (:0)
myuser pts/4 2017-01-19 09:14 (:0)
Run Code Online (Sandbox Code Playgroud)
为什么不echo -e $cur_log
解释换行符,但 `echo -e $new_line 可以解释?
原因是在您的第一个变量 ( new_line
) 中,只有一个转义序列(即\n
=backslash
后跟n
)被原封不动地传递给echo
,而在第二个变量 ( ) 中,有cur_log
实际的换行符被外壳去除该IFS
变量。
在 Unix/Linux 下,换行是单个字符,ASCII代码是10
(换行)。当屏幕上显示包含该字符的文件时,它会转换为两个字符,回车加换行符 ( CR-LF
),10
+ 13
。当类似的编辑器gedit
打开这样一个文件时,它会分别存储每一行。换行仅用于检测两条连续行之间的间隔。\n
由两个字符组成,ASCII 92
+ 110
. 如果您编辑包含出现\n
这两个字符的文件,将保持不变并按原样显示,这与真正的换行符不同。