如何在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
相关产品推荐
相关产品推荐

