Bash shell中如何将命令返回的多列值分别赋值给两个变量
你当前脚本无法实现需求的核心原因是:INFO=$(mycommand | awk 'NR==1 {print $1,$2}')是将命令输出赋值给了普通字符串变量,而非数组,因此用数组下标${INFO[1]}、${INFO[2]}无法读取到对应列的值,只有${INFO[0]}会返回整个val1 val2字符串。
以下是几种可直接落地的实现方案:
方案1:用read直接读取两个变量(最推荐,性能最优)
直接用shell内置read命令接收mycommand的输出,自动按空白符分割赋值,无需额外调用awk:
# var1对应val1,var2对应val2,剩余列内容自动存入rest变量可忽略 read var1 var2 rest < <(mycommand) # 打印验证 echo "INFO 1 is $var1" echo "INFO 2 is $var2"
如果是POSIX sh环境不支持进程替换,可改用管道写法(注意部分shell如默认配置的bash中,管道内变量属于子shell,父shell无法读取,这种场景优先用进程替换写法):
mycommand | read var1 var2 rest
方案2:将结果赋值给数组后读取
如果你需要保留数组用法,需要显式将输出转为数组结构:
# 用括号包裹命令输出,自动按空白分割为数组 INFO=($(mycommand | awk 'NR==1 {print $1,$2}')) # 注意:Bash数组默认下标从0开始,第一个元素是${INFO[0]},第二个是${INFO[1]} echo "INFO 1 is ${INFO[0]}" echo "INFO 2 is ${INFO[1]}"
方案3:单独调用awk赋值(仅适合mycommand执行开销极低的场景)
var1=$(mycommand | awk 'NR==1 {print $1}') var2=$(mycommand | awk 'NR==1 {print $2}') echo "INFO 1 is $var1" echo "INFO 2 is $var2"
缺点是会执行两次mycommand,若命令执行慢、有副作用或者每次输出结果不一致时不要使用该方案。
内容的提问来源于stack exchange,提问作者user8473984
相关产品推荐
相关产品推荐

