shell 如何在变量中追加echo命令的输出

pprl5pva  于 12个月前  发布在  Shell
关注(0)|答案(4)|浏览(130)
echo "string1"
echo "string2"

我想把两个echo都写在一个变量中,但是我想把第二个echo附加在第一个echo已经写好的东西上,这样当我调用它的时候:

string1
string2

此外,回声的输出应该用新的线分开。

vqlkdk9b

vqlkdk9b1#

var=$( echo "string1"; echo "string2" )
dluptydi

dluptydi2#

我不确定我是否理解OP的要求;如果这仅仅是两个字符串的换行.
使用printf -v的一个想法:

$ printf -v var "%s\n%s" "string1" "string2"

$ typeset -p var
declare -- var="string1
string2"

$ echo "${var}"
string1
string2

或者更简单地说:

$ var="string1"$'\n'"string2"

$ typeset -p var
declare -- var="string1
string2"

$ echo "${var}"
string1
string2
zynd9foi

zynd9foi3#

你可以只插入一个换行符(如果你不介意扭曲缩进):

A="$(echo string1)
$(echo string2)"; 

   # test it now:
   echo -n "$A"|od -c
000000   s   t   r   i   n   g   1  \n   s   t   r   i   n   g   2
0000017

如果你不喜欢打破压痕,换行就成了一件珍贵的事情。但是有很多方法可以得到它:

# NL will contain line-break char
printf -v NL "\n"; 

# Or trick by inserting and removing X
NL="$(echo -e '\nX')"; NL="${NL/X}";

#test:
echo -n "$NL" | od -c
0000000  \n
0000001
  

# use it:
A="$(echo string1)$NL$(echo string2)"; 

# test it now:
echo -n "$A"|od -c
000000   s   t   r   i   n   g   1  \n   s   t   r   i   n   g   2
0000017

或者我们可以把它变成一行程序。我也可以用hexdump代替od进行测试。

printf -v B "%s\n%s"  "$(echo string1)" "$(echo string2)"; 

echo "$B" | hexdump -C
00000000  73 74 72 69 6e 67 31 0a  73 74 72 69 6e 67 32 0a  |string1.string2.|
00000010

-v B表示将结果存储到变量B中,而不是将其打印出来。
\n不需要评论。
%s类似于C中的printf()函数,参数作为命令行上的参数。(如果不想丢失%等,请不要使用printf -v B "$(echo foo%%)$(echo bar%d)"。它们在第一个参数中具有占位符功能。)

anauzrmj

anauzrmj4#

a="${a:+$a\n}$(echo "string1")"
a="${a:+$a\n}$(echo "string2")"
echo $a

它具有可以添加和删除任何字符串的功能,并且在第一个字符串之前不会有新行。

相关问题