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

如何在Busybox的ash Shell中提取命令输出值到多变量?

在ash Shell中提取VDSL调制解调器的上行/下行速率值

问题描述

我的VDSL调制解调器运行Busybox,仅提供ash Shell。我需要将命令/bin/dsl-tool iadtool的输出内容存入多个变量,最终获取ActualDataRateUS(上行速率)和ActualDataRateDS(下行速率)的数值。该命令输出如下:

DSLAPI-Version=dsl-api-1.12.0
IADToolAPI-Version=0.0.1
LineState=Showtime
TransmissionSystem=G993.2 Region B Annex B
xDslMode=VDSL2
ActualDataRateUS=43992000
ActualDataRateDS=276368000
FirmwareVersion=8.13.1.12.1.7

我之前的测试脚本只能拿到带键名的完整行,比如ActualDataRateUS=43992000,但只需要后面的数值。习惯用Python的我想知道,这个需求能不能在ash里实现?

解决方案

当然可以在ash中实现,以下是几种实用方法:

方法1:直接加载变量(最简洁)

因为命令输出是key=value的格式,可以直接将输出作为Shell代码执行,自动创建对应变量:

#!/bin/ash
# 过滤出需要的两行,作为变量定义加载
eval "$(/bin/dsl-tool iadtool | grep -E 'ActualDataRate(US|DS)')"

# 直接使用变量
echo "上行速率:$ActualDataRateUS"
echo "下行速率:$ActualDataRateDS"

注意:仅在你完全信任该命令输出的情况下使用,避免潜在的代码注入风险

方法2:用cut分割提取

针对单条结果,用cut按=分割取第二部分:

#!/bin/ash
# 提取上行速率数值
actual_us=$(/bin/dsl-tool iadtool | grep ActualDataRateUS | cut -d'=' -f2)
# 提取下行速率数值
actual_ds=$(/bin/dsl-tool iadtool | grep ActualDataRateDS | cut -d'=' -f2)

echo "上行速率:$actual_us"
echo "下行速率:$actual_ds"

缺点:会执行两次dsl-tool命令,若命令执行耗时则效率较低。

方法3:用awk一次提取(高效)

通过awk处理一次命令输出,同时提取两个数值并赋值给变量,只执行一次命令:

#!/bin/ash
# 一次执行命令,用awk提取所需值,再通过read赋值给变量
read actual_us actual_ds <<EOF
$(/bin/dsl-tool iadtool | awk -F'=' '/ActualDataRateUS/{us=$2} /ActualDataRateDS/{ds=$2} END{print us, ds}')
EOF

echo "上行速率:$actual_us"
echo "下行速率:$actual_ds"

这种方法适合资源有限的嵌入式设备,效率更高。

内容的提问来源于stack exchange,提问作者Gamienator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:35