在 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这两个字符的文件,将保持不变并按原样显示,这与真正的换行符不同。