2017-09-07 30 views
1

在执行脚本时,我遇到了以下问题:将命令的多行结果放入变量时,看起来多行字符串的最后一行(空行)消失。因为我将保存在数据库中的代码块和包含“\ 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'`"; 

,但我试图简化问题,最让我可以。

+0

命令替换总是修剪后的新行 - - 这符合设计和规范。否则,'foo = $(echo foo)'不会包含字符串'foo',但会有一个尾随的换行符 - 这会混淆人们。 –

+0

顺便说一句,哪个特定版本的ksh是这个?有很多不同的,不兼容的实现浮动。 –

+0

@CharlesDuffy无法找到我正在使用的ksh版本的命令...我试过“ksh --version”,“echo $ {。sh.version}”&“echo $ KSH_VERSION”。如果你知道识别我的ksh版本的其他可能性,我非常感兴趣;-) – Seba991

回答

2

命令替换总是修剪后的新行 - 这是按照设计和规格。如果你不希望出现这种情况,可以追加一个固定的印记字符到您的输出,并修剪它,这样你希望保留换行符之前的印记:

test="A 

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

的确,有了这个想法,我可以得到我想要的结果 test_wip = $(printf'%sENDOFLINE'“$ test”); test_wip2 =“'echo”$ test_wip“| sed -e's/\^// g''”; test2 = $ {test_wip2%ENDOFLINE}; 让我们希望没有人会在我试图解释的代码中使用“ENDOFLINE”。 – Seba991

+0

@ Seba991:你可以使用'test2 =“$(echo”$ {test}“)来缩短一点,ENDOFLINE | sed -e's/\^// g')”'; 'test2 =“$ {test2%ENDOFLINE}”' – markp

+0

@ Seba991,好吧,我们只是删除一个'ENDOFLINE'(最后一个),所以没关系,如果*是*额外的数据中的字面意思。 –

0

,而不是试图解决的是从echo输出分配给一个变量出现的问题(例如,去除尾随\ n的),可以考虑使用内置的字符串处理ksh的在这种情况下,如:

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

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

当我尝试,我得到错误: KSH:TEST2 =“$ {测试//^}“:0403-011指定的替换对此命令无效。 – Seba991

+0

嗯,'ksh --version'返回什么? – markp

+0

@ Seba991,该命令替换在ksh 93u +中有效;如果您使用的是旧版本(或者不兼容的第三方克隆,例如mksh),则应在问题中指定该版本。 –

相关问题