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

时间:2017-03-28 16:59:12

标签: bash variables quoting

[OSX 10.11.6上的bash 3.2.57(1)]

我神秘地丢失了一个变量中的空白行,我在该变量中指定了一个以几个空白行结尾的命令的输出。

   [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设置为执行命令的结果时,我该怎么做才能保留它们? (我的真正命令不仅仅是回声,但回声是一个很好的最小例子。)为什么当我使用变量的值而不是命令的输出时这是有用的?

1 个答案:

答案 0 :(得分:1)

这实际上是预期的行为。

点击http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

注意它在这里说的是什么

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

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

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