为什么 echo `echo -e "abc\nabc"` 给我 "abc abc"?

why echo `echo -e "abc\nabc"` gives me "abc abc"?

关于linux-shell的问题。

当我打字时

echo `echo -e "abc\nabc"`,

我得到了 abc abc 而不是 abc\nabc

看看不同层分别做了什么:

$ echo -e "abc\nabc"
abc
abc

因为 echo -e 扩展了反斜杠转义,例如 \n。 (至少您使用的是这样;行为在 shell 秒内不一致。)

然后,你 echo 那个输出,不加引号;这会用每个空白字符 ("word splitting").

替换任何空白序列(包括换行符)
$ str="abc
abc"
$ echo $str
abc abc

如果引用字符串,将保留空格(shell 特殊字符无效):

$ echo "$str"
abc
abc

您可以通过引用您的命令替换来实现相同的目的:

$ echo "`echo -e \"abc\nabc\"`"
abc
abc

不过,您必须转义内部双引号。这就是为什么现在建议使用 $(...) 代替反引号的原因之一:

$ echo "$(echo -e "abc\nabc")"
abc
abc

如果这不仅仅是一个学习示例,请注意 echo "$(cmd)" 通常是一种反模式,应该只替换为 cmd.


参考资料

  • This 很好地概述了 echo(和 printf)在不同 shells
  • 中的表现
  • echoPOSIX spec 以及建议改用 printf 的建议