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

How to append output of echo command in variable

提问人:Калоян Петров 提问时间:8/20/2023 最后编辑:John KugelmanКалоян Петров 更新时间:8/21/2023 访问量:117

问:

echo "string1"
echo "string2"

我想在一个变量中写入两个回显,但我希望第二个回显附加在第一个回显已经写入的内容上,因此当我调用它时:

string1
string2

此外,回波的输出应用换行符分隔。

bash shell 变量

评论

0赞 markp-fuso 8/20/2023
您的唯一目的是用换行符附加两个字符串吗?
3赞 Ed Morton 8/20/2023
你为什么要参与其中,而不仅仅是或类似?echovar='string1'; var="$var"$'\n''string2'

答:

0赞 minorChaos 8/20/2023 #1

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

   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

或者我们可以把它变成一句话。我也可以代替测试。hexdumpod

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就像在函数中一样,参数在命令行上作为参数出现。(如果您不想丢失等,请不要使用。它们在第一个参数中具有占位符函数。printf()Cprintf -v B "$(echo foo%%)$(echo bar%d)"%

评论

0赞 jhnc 8/20/2023
由于问题是关于 bash 的:(请注意,printf 的选项是不可移植NL=$'\n'-v)
0赞 minorChaos 8/20/2023
谢谢。我认为这在15年前是不可能的。
0赞 jhnc 8/20/2023
使用任何 POSIX shell,您都可以执行 <kbd>return</kbd>NL=''
0赞 minorChaos 8/20/2023
@jhnc:如果POSIX兼容,那么POSIX是否也是如此?(这是我的第一个解决方案。NL='line-break'NL="line-break"
0赞 jhnc 8/20/2023
是的
-1赞 puravidaso 8/20/2023 #2
a="${a:+$a\n}$(echo "string1")"
a="${a:+$a\n}$(echo "string2")"
echo $a

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

评论

0赞 jhnc 8/20/2023
我认为你需要.赋值需要双引号,但不需要${a:+$a$'\n'}echo
0赞 minorChaos 8/20/2023
@puravidaso:我认为你应该放在第一行之前,因为你不能假设是未分配的。a=""a
1赞 markp-fuso 8/20/2023 #3

我不确定我是否理解 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

评论

0赞 puravidaso 8/20/2023
我以为 OP 要求保存命令的输出,但如果没有,我们可以只写 var=“string1\nstring2” 并完成它。
0赞 markp-fuso 8/20/2023
@puravidaso老实说,我不确定OP的要求是什么
1赞 jhnc 8/20/2023 #4
var=$( echo "string1"; echo "string2" )

评论

1赞 minorChaos 8/20/2023
这很优雅(我现在觉得有点傻)。但是,这取决于发出换行符的第一个命令。例如,如果将 echo 替换为 ,它将不起作用。echo -n
1赞 jhnc 8/20/2023
是的,从技术上讲,这不是在回声之间插入换行符。但这个问题还不清楚
1赞 Cyrus 8/21/2023
我建议:var=$( echo "string1" | tr -d '\n'; echo; echo "string2" | tr -d '\n'; echo )
0赞 user1934428 8/21/2023
@minorChaos : 这个论点很奇怪。如果一个人明确地写了,那么他这样做的目的是不需要换行符。echo -n
1赞 minorChaos 8/22/2023
@Cyrus:是的。这解决了这种情况。