0

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

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

我首先填充$user,这是我希望换行符跟随的值。

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

echo $user然后我在双引号命令替换中调用。该echo语句应在 之后创建一个换行符$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;这并没有改变任何东西。

这是预期的行为吗?

4

2 回答 2

4

命令替换删除尾随换行符。从标准

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

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

recipient="$user
"

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

于 2013-01-09T19:26:10.543 回答
1

所有的 shell 版本都会以同样的方式做出反应,这在脚本中并不是什么新鲜事。

原始赋值末尾的换行符不包含在变量的值中。它只会“终止”当前的 cmd 并向 shell 发出信号以进行处理。

也许 user="user@xxx.com\n" 会起作用,但没有关于你为什么想要这个的上下文,只知道人们通常将变量值与换行符等格式化“工具”分开。

IHTH。

于 2013-01-09T19:28:24.123 回答