You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:39:03