使用 BusyBox 将 2 行合并为 key=value 字符串
Posted
技术标签:
【中文标题】使用 BusyBox 将 2 行合并为 key=value 字符串【英文标题】:Merging 2 rows into key=value string with BusyBox 【发布时间】:2021-10-31 17:57:47 【问题描述】:我需要为嵌入式 linux 编写一个 sh 脚本,它只有 BusyBox (v1.30.1)。我可以使用“sh”、“awk”或“sed”。
我有一个接收 2 个变量的脚本:
columns="usr sys nic idle io irq sirq"
points="2.2 4.5 0.0 93.1 0.0 0.0 0.0"
两个变量都可以有任意数量的测量值(从 1 到 ~15)。
我需要将它们组合起来以获得一个 3'd 变量:
payload="usr=2.2, sys=4.5, nic=0.0, idle=93.1, io=0.0, irq=0.0, sirq=0.0"
Sh 不支持数组,所以我不能遍历“列”和“点”。有什么方法可以在 sh 脚本中(理想情况下)或使用 BusyBox 中可用的外部命令来完成此任务?
编辑:根据 James Brown 的要求添加了我尝试过的内容(显然它不起作用,因为 sh 不支持数组):
for index in $!columns[*]; do
payload="$payload $columns[$index]=$points[$index]"
done
【问题讨论】:
columns
是否包含 shell 元字符?如果没有,something like this 应该可以正常工作。
I have a script which receives 2 variables:
是什么意思?脚本可以从文件或管道读取输入,它们可以传递参数,并且它们可以访问环境变量 - 是您的脚本正在访问的这两个环境变量,还是从文件或管道读取以填充它们或其他东西?现在感觉就像我们正在从您当前解决实际问题的方法的一半开始,并且可能有一个更好的起点。
@oguzismail,您的解决方案完美运行,并且实现起来非常简单。不过,我仍然不明白它是如何工作的,我想我会花一些时间查看 Bash 参考手册。
@EdMorton,对不起,你当然是对的。我的脚本通过传递的参数获取这些变量。每个变量都用双引号括起来,如下所示: script.sh "column1 column2 column3" "point1 poin2 point3"
【参考方案1】:
使用Busybox awk
:
$ payload=$(busybox awk -v c="$columns" -v p="$points" '
BEGIN
n=split(c,cc)
m=split(p,pp)
if(m==n)
for(i=1;i<=n;i++)
printf "%s=%s%s",cc[i],pp[i],(i==n?ORS:", ")
')
$ echo $payload
usr=2.2 sys=4.5 nic=0.0 idle=93.1 io=0.0 irq=0.0 sirq=0.0
【讨论】:
谢谢,您的示例运行良好。你能解释一下“i==n?ORS:OFS”是什么意思吗?我用谷歌搜索了 ORS 和 OFS,但仍然不明白为什么你需要“:”之间以及这整行的含义。我想如果我弄明白的话,它也可以让我用逗号分隔值。 它被称为条件运算符,另一种写法(但不能像上面那样使用完全)是if(i==n) printf "%s", ORS; else printf "%s", OFS
。以上方式可以附加到单个printf
。
知道了!谢谢您的帮助!我将其更改为 (i==n?ORS:", ") 并最终得到了我需要的东西。我应该按原样接受您的回答,还是您先相应地更改它?以上是关于使用 BusyBox 将 2 行合并为 key=value 字符串的主要内容,如果未能解决你的问题,请参考以下文章