将命令输出分配给变量时丢失最后的空白行

Losing final blank lines when assigning command output to a variable

[bash 3.2.57(1) 在 OSX 10.11.6]

我神秘地丢失了一个变量中的结束空行,我已将命令的输出分配给该变量,该命令的输出以几个空行结尾。

   [1] $ p="next line is blank

   next several lines are blank


   "
   [2] $ echo $p
   next line is blank next several lines are blank
   [3] $ echo "$p"
   next line is blank

   next several lines are blank



   [4] $ q="$p"
   [5] $ echo "$q"
   next line is blank

   next several lines are blank



   [6] $ r=`echo "$p"`
   [7] $ echo "$r"
   next line is blank

   next several lines are blank
   [8] $

[1] 到 [6] 中发生的一切都符合预期。 但是 [7] 令人困惑。最后几行去了哪里,当我将 r 设置为执行命令的结果时,我该怎么做才能保留它们? (我的真实命令不仅仅是 echo,但 echo 是一个很好的最小示例。)为什么当我使用变量的值而不是命令的输出时它会起作用?

这实际上是预期的行为。

在此处查看http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

注意这里说的是什么

Bash 通过在子 shell 环境中执行命令并将命令替换替换为命令的标准输出来执行扩展,删除任何尾随换行符

要解决这个问题,你可以使用这个技巧(我们在字符串的末尾添加一个字母,以便保留它之前的行,然后将其删除)

r=`echo "$p"n`
rr=${r::-1}
echo "$rr"