1

在实现脚本时,我面临以下问题:将命令的多行结果放入变量时,多行字符串的最后(空)行似乎消失了。

这一行是“空的”,但是,我不能丢失它包含的回车(因为我将保存在数据库中并包含“\n”字符的代码块连接成一个人类可读的字符串......如果我丢失了一些“\n”,我将失去我的代码缩进的一部分)

这是说明我的问题的代码:

test="A

B
";
test2=`echo "$test"`;
echo "||$test2||";

这返回

||A

B||

在我期待的时候:

||A

B
||

--> 最后(空)行已经消失了……因此在我的可读代码中缺少回车符。

仅当我的多行字符串的最后一行为空时才会出现此问题...

你知道吗

  • 为什么最后一行消失了?
  • 如何确保我的最后一个空行保存在我的多行字符串变量中?

请注意,我当然不能使用最简单的解决方案

test2="$test";

因为完整的过程相当:

test="^A\n\nB\n^"
test2="`echo "$test" | sed -e 's/\^//g'`";

但我尽量简化这个问题。

4

2 回答 2

2

命令替换总是修剪尾随的换行符——这符合设计和规范。如果您不希望这样,您可以将一个固定的印记字符附加到您的输出并修剪它,以便您要保留的换行符在印记之前:

test="A

B
"
test_wip=$(printf '%sEND' "$test")
test2=${test_wip%END}
于 2017-09-07T19:48:44.073 回答
0

与其尝试解决将输出分配给echo变量(例如,剥离尾随 \n's)而产生的问题,不如考虑ksh在这种情况下使用 ' 内置字符串处理,例如:

$ test="^A\n\nB\n^"
$ test2="${test//^}"
$ echo "||${test2}||"
||A

B
||
  • //^: 删除所有^字符
于 2017-09-07T19:39:45.397 回答