为什么 echo -e 不解释新行?

Hrv*_*e T 4 bash newlines

在 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 可以解释?

jll*_*gre 5

原因是在您的第一个变量 ( new_line) 中,只有一个转义序列(即\n=backslash后跟n)被原封不动地传递给echo,而在第二个变量 ( ) 中,有cur_log实际的换行符被外壳去除该IFS变量。

在 Unix/Linux 下,换行是单个字符,ASCII代码是10(换行)。当屏幕上显示包含该字符的文件时,它会转换为两个字符,回车加换行符 ( CR-LF),10+ 13。当类似的编辑器gedit打开这样一个文件时,它会分别存储每一行​​。换行仅用于检测两条连续行之间的间隔。\n由两个字符组成,ASCII 92+ 110. 如果您编辑包含出现\n这两个字符的文件,将保持不变并按原样显示,这与真正的换行符不同。