,为什么我的多行字符串的最后一行(空行)在将其保存在变量中时会消失?
在执行脚本时,我遇到了以下问题:将命令的多行结果放入变量时,看起来多行字符串的最后一行(空行)消失。因为我将保存在数据库中的代码块和包含“\ n”字符的代码块连接在一个可读的字符串中,因此我不能丢失它包含的回车符。如果我失去了一些“\ N”的,我会失去我的代码缩进的一部分),为什么我的多行字符串的最后一行(空行)在将其保存在变量中时会消失?
这里是代码来说明我的问题:
test="A
B
";
test2=`echo "$test"`;
echo "||$test2||";
这将返回
||A
B||
w ^往往微不足道我期待:
||A
B
||
- >最后一个(空)线已经消失......并回车在我的人类可读的代码从而错过。只有当我的多线串的最后一行是空的发生
这个问题......
你知道
- 为什么最后一行消失?
- 我如何确保我最后的空行保存在我的多行字符串变量中?
注意,我当然不能用最简单的解决
test2="$test";
因为整个过程相当:
test="^A\n\nB\n^"
test2="`echo "$test" | sed -e 's/\^//g'`";
,但我试图简化问题,最让我可以。
命令替换总是修剪后的新行 - 这是按照设计和规格。如果你不希望出现这种情况,可以追加一个固定的印记字符到您的输出,并修剪它,这样你希望保留换行符之前的印记:
test="A
B
"
test_wip=$(printf '%sEND' "$test")
test2=${test_wip%END}
的确,有了这个想法,我可以得到我想要的结果 test_wip = $(printf'%sENDOFLINE'“$ test”); test_wip2 =“'echo”$ test_wip“| sed -e's/\^// g''”; test2 = $ {test_wip2%ENDOFLINE}; 让我们希望没有人会在我试图解释的代码中使用“ENDOFLINE”。 – Seba991
@ Seba991:你可以使用'test2 =“$(echo”$ {test}“)来缩短一点,ENDOFLINE | sed -e's/\^// g')”'; 'test2 =“$ {test2%ENDOFLINE}”' – markp
@ Seba991,好吧,我们只是删除一个'ENDOFLINE'(最后一个),所以没关系,如果*是*额外的数据中的字面意思。 –
,而不是试图解决的是从echo
输出分配给一个变量出现的问题(例如,去除尾随\ n的),可以考虑使用内置的字符串处理ksh
的在这种情况下,如:
$ test="^A\n\nB\n^"
$ test2="${test//^}"
$ echo "||${test2}||"
||A
B
||
-
//^
:删除所有^
字符
命令替换总是修剪后的新行 - - 这符合设计和规范。否则,'foo = $(echo foo)'不会包含字符串'foo',但会有一个尾随的换行符 - 这会混淆人们。 –
顺便说一句,哪个特定版本的ksh是这个?有很多不同的,不兼容的实现浮动。 –
@CharlesDuffy无法找到我正在使用的ksh版本的命令...我试过“ksh --version”,“echo $ {。sh.version}”&“echo $ KSH_VERSION”。如果你知道识别我的ksh版本的其他可能性,我非常感兴趣;-) – Seba991