在 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}
在执行脚本时,我遇到了以下问题: 将命令的多行结果放入变量时,我的多行字符串的最后(空)行似乎消失了。
这一行是"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}