在 Ksh 中,为什么我的多行字符串的最后(空)行在将它保存在变量中时消失了?

in Ksh, why does the last (empty) line of my multi-line string disappears when saving it in a variable?

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

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

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

test="A

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

这个return秒

||A

B||

当我期待时:

||A

B
||

--> 最后(空)行消失了……因此在我的人类可读代码中缺少了一个回车 return。

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

你知道吗

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

test2="$test";

因为完整的过程相当:

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

但我尽量简化了这个问题。

与其尝试解决因将 echo 的输出分配给变量(例如,去除尾随的 \n's)而产生的问题,不如考虑使用 ksh 的内置字符串本例处理,eg:

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

B
||
  • //^ : 删除所有 ^ 个字符

命令替换总是 trim 尾随换行符 -- 这符合设计和规范。如果你不想这样,你可以在你的输出中附加一个固定的印记字符,然​​后 trim 它,这样你想保留的换行符就在 印记之前:

test="A

B
"
test_wip=$(printf '%sEND' "$test")
test2=${test_wip%END}