Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 当以双引号调用时,将从echo中删除换行符_Bash_Echo_Sh - Fatal编程技术网

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