Bash 当以双引号调用时,将从echo中删除换行符
我正在尝试填充一个名为Bash 当以双引号调用时,将从echo中删除换行符,bash,echo,sh,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 $ recipient="$(echo $user)" ++ echo user@xxx.com + recipient=user@xxx.com 然后在
$recipient
的shell变量,该变量应该包含一个后跟新行的值
$ set -x # force bash to show commands as it executes them
我首先填充$user
,这是我希望在换行后跟随的值
$ user=user@xxx.com
+ user=user@xxx.com
$ recipient="$(echo $user)"
++ echo user@xxx.com
+ recipient=user@xxx.com
然后在双引号命令替换中调用echo$user
。echo
语句应在$user
之后创建一个新行,双引号应保留该新行
$ user=user@xxx.com
+ user=user@xxx.com
$ recipient="$(echo $user)"
++ echo user@xxx.com
+ recipient=user@xxx.com
但是,当我打印$recipient
时,我可以看到换行符已被丢弃
$ echo "'recipient'"
+ echo ''\''recipient'\'''
'recipient'
我在bash版本4.1.5和3.1.17中发现了相同的行为,并在dash中复制了这个问题
我尝试使用“printf”而不是echo;这没有改变任何事情
这是预期的行为吗?命令替换将删除尾随的换行符。从: shell应通过在子shell环境中执行命令(参见shell执行环境)并用命令的标准输出替换命令替换(命令文本加上括起来的“$()”或反引号)来扩展命令替换,删除替换结束时一个或多个字符的序列。输出结束前的嵌入字符不得删除;但是,它们可能被视为字段分隔符,并在字段拆分期间消除,具体取决于有效的IFS值和引号。如果输出包含任何空字节,则行为未指定 您必须显式地添加换行符。也许:
recipient="$user
"
这里真的没有理由使用命令替换。(也就是说,
$(echo…
几乎总是一件愚蠢的事情。)命令替换会删除尾随的换行符。从:
shell应通过在子shell环境中执行命令(参见shell执行环境)并用命令的标准输出替换命令替换(命令文本加上括起来的“$()”或反引号)来扩展命令替换,删除替换结束时一个或多个字符的序列。输出结束前的嵌入字符不得删除;但是,它们可能被视为字段分隔符,并在字段拆分期间消除,具体取决于有效的IFS值和引号。如果输出包含任何空字节,则行为未指定
您必须显式地添加换行符。也许:
recipient="$user
"
这里真的没有理由使用命令替换。(也就是说,
$(echo…
几乎总是一件愚蠢的事情。)所有shell版本的反应都是一样的,这在脚本编写中并不是什么新鲜事
原始赋值末尾的新行不包含在变量值中。它只“终止”当前cmd,并向shell发出处理信号
也许用户=”user@xxx.com\n“将起作用,但没有上下文说明为什么要这样做,只需知道人们通常将变量值与格式“工具”(如换行符)分开
IHTH.所有shell版本的反应都是一样的,这在脚本编写中并不是什么新鲜事 原始赋值末尾的新行不包含在变量值中。它只“终止”当前cmd,并向shell发出处理信号 也许用户=”user@xxx.com\n“将起作用,但没有上下文说明为什么要这样做,只需知道人们通常将变量值与格式“工具”(如换行符)分开 IHTH