我正在尝试填充名为$recipient
的shell变量,该变量应包含一个后跟换行符的值。
$ 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;这并没有改变什么。
这是预期的行为吗?
答案 0 :(得分:4)
命令替换删除尾随换行符。来自standard:
shell应通过在子shell环境中执行命令(参见Shell执行环境)并使用标准输出替换命令替换(命令文本加上封闭的“$()”或反引号)来扩展命令替换。命令,在替换结束时删除一个或多个字符的序列。输出结束前的嵌入字符不得删除;但是,根据IFS的值和有效的引用,它们可以被视为字段分隔符并在字段拆分期间被消除。如果输出包含任何空字节,则行为未指定。
您必须明确添加换行符。也许:
recipient="$user
"
这里没有理由使用命令替换。 (也就是说$(echo ...)
几乎总是愚蠢的事情。)
答案 1 :(得分:1)
所有shell版本都会以相同的方式做出反应,这在脚本编写方面并不新鲜。
原始作业末尾的换行不包含在变量的值中。它只“终止”当前cmd并通知shell进行处理。
也许user =“user@xxx.com \ n”可以使用,但是没有关于你为什么要这样做的上下文,只要知道人们通常将变量值与格式化“工具”(如换行符)分开。
IHTH。