为什么 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 中的表现
echo
的 POSIX spec 以及建议改用 printf
的建议
关于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 中的表现
echo
的 POSIX spec 以及建议改用printf
的建议