当用双引号调用时,换行符将从echo中删除

时间:2013-01-09 19:21:08

标签: bash echo sh

我正在尝试填充名为$recipient的shell变量,该变量应包含一个后跟换行符的值。

$ set -x # force bash to show commands as it executes them

我首先填充$user,这是我想要换行的值。

$ user=user@xxx.com
+ user=user@xxx.com

然后我在双引号命令替换中调用echo $userecho语句应在$user之后创建换行符,双引号应保留换行符。

$ recipient="$(echo $user)"
++ echo user@xxx.com
+ recipient=user@xxx.com

但是,当我打印$recipient时,我可以看到换行符已被丢弃。

$ echo "'recipient'"
+ echo ''\''recipient'\'''
'recipient'

我在bash版本4.1.5和3.1.17下发现了相同的行为,并且还在破折号下复制了该问题。

我尝试使用“printf”而不是echo;这并没有改变什么。

这是预期的行为吗?

2 个答案:

答案 0 :(得分:4)

命令替换删除尾随换行符。来自standard

shell应通过在子shell环境中执行命令(参见Shell执行环境)并使用标准输出替换命令替换(命令文本加上封闭的“$()”或反引号)来扩展命令替换。命令,在替换结束时删除一个或多个字符的序列。输出结束前的嵌入字符不得删除;但是,根据IFS的值和有效的引用,它们可以被视为字段分隔符并在字段拆分期间被消除。如果输出包含任何空字节,则行为未指定。

您必须明确添加换行符。也许:

recipient="$user
"

这里没有理由使用命令替换。 (也就是说$(echo ...)几乎总是愚蠢的事情。)

答案 1 :(得分:1)

所有shell版本都会以相同的方式做出反应,这在脚本编写方面并不新鲜。

原始作业末尾的换行不包含在变量的值中。它只“终止”当前cmd并通知shell进行处理。

也许user =“user@xxx.com \ n”可以使用,但是没有关于你为什么要这样做的上下文,只要知道人们通常将变量值与格式化“工具”(如换行符)分开。

IHTH。