解析多个输出
简介
所以你的myscript 输出 3 行,可能看起来像:
myscript() { echo $'abc\ndef\nghi'; }
或
myscript() { local i; for i in abc def ghi ;do echo $i; done ;}
好的,这是一个函数,不是脚本(不需要路径./),但是输出是一样的
myscript
abc
def
ghi
考虑结果代码
为了检查结果代码,测试函数将变为:
myscript() { local i;for i in abc def ghi ;do echo $i;done;return $((RANDOM%128));}
1。将多个输出存储在一个变量中,显示 换行符
你的操作是正确的:
RESULT=$(myscript)
关于结果代码,可以补充:
RCODE=$?
即使在同一行:
RESULT=$(myscript) RCODE=$?
然后
echo $RESULT $RCODE
abc def ghi 66
echo "$RESULT"
abc
def
ghi
echo ${RESULT@Q}
$'abc\ndef\nghi'
printf "%q\n" "$RESULT"
$'abc\ndef\nghi'
但要显示变量定义,请使用declare -p:
declare -p RESULT RCODE
declare -- RESULT="abc
def
ghi"
declare -- RCODE="66"
2。解析数组中的多个输出,使用mapfile
将答案存储到myvar 变量中:
mapfile -t myvar < <(myscript)
echo ${myvar[2]}
ghi
显示$myvar:
declare -p myvar
declare -a myvar=([0]="abc" [1]="def" [2]="ghi")
考虑结果代码
如果您必须检查结果代码,您可以:
RESULT=$(myscript) RCODE=$?
mapfile -t myvar <<<"$RESULT"
declare -p myvar RCODE
declare -a myvar=([0]="abc" [1]="def" [2]="ghi")
declare -- RCODE="40"
3。在命令组中通过连续read 解析多个输出
{ read firstline; read secondline; read thirdline;} < <(myscript)
echo $secondline
def
显示变量:
declare -p firstline secondline thirdline
declare -- firstline="abc"
declare -- secondline="def"
declare -- thirdline="ghi"
我经常使用:
{ read foo;read foo total use free foo ;} < <(df -k /)
然后
declare -p use free total
declare -- use="843476"
declare -- free="582128"
declare -- total="1515376"
考虑结果代码
相同的前置步骤:
RESULT=$(myscript) RCODE=$?
{ read firstline; read secondline; read thirdline;} <<<"$RESULT"
declare -p firstline secondline thirdline RCODE
declare -- firstline="abc"
declare -- secondline="def"
declare -- thirdline="ghi"
declare -- RCODE="50"