提问人:Калоян Петров 提问时间:8/20/2023 最后编辑:John KugelmanКалоян Петров 更新时间:8/21/2023 访问量:117
如何在变量中附加 echo 命令的输出
How to append output of echo command in variable
问:
echo "string1"
echo "string2"
我想在一个变量中写入两个回显,但我希望第二个回显附加在第一个回显已经写入的内容上,因此当我调用它时:
string1
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
或者我们可以把它变成一句话。我也可以代替测试。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
就像在函数中一样,参数在命令行上作为参数出现。(如果您不想丢失等,请不要使用。它们在第一个参数中具有占位符函数。printf()
C
printf -v B "$(echo foo%%)$(echo bar%d)"
%
评论
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:是的。这解决了这种情况。
评论
echo
var='string1'; var="$var"$'\n''string2'