[NoIFS]使用shell读取cfg并拆成数组

场景

需要解析一个文本,里面描述了客户分区参数,形式如下

ImageConfig.cfg
============================================
env 1024 2048 env.fex
kernel 2049 33791 boot.img
recovery 33792 164863 recovery.img

玩法就是把每一行拆成单独的数据,送入对应数组中,最后形成

PartName=(env kernel recovery)
PartStart=(1024 2049 33792)
PartEnd=(2048 33791 164863)
PartFS=(env.fex boot.img recovery.img)

这样就可以对应上我之前写的脚本,自行将数据写入FakeMMC.img

解决方案

1. 修改IFS拆分数据

我个人非常不喜欢修改IFS来自定义拆分数组的方式,修改$IFS一定要成对出现,脚本结束时要还原,不然系统就被你改了,那如果在脚本执行中途出现意外,那就还原不了。就很烦,用了两次直接PASS了

2. 使用cat 和read

这一段用的时候发现两个很诡异的问题。

  1. 数组我传不出去。当这个循环结束后,所有赋值都消失了。
    i变回了0,数组没有任何值
    猜想是否 cat 管道,赋值是在另一个空间完成,变量没有留到主空间来
  2. 如果cfg结尾不加一个空白行,那么最后一行数据会丢失
cat ImageConfig.cfg |
while read PartName_ PartStart_ PartEnd_ PartFS_
do
    PartName[i]=$PartName_
    PartStart[i]=$PartStart_
    PartEnd[i]=$PartEnd_
    PartFS[i]=$PartFS_
    echo $i ${PartName[$i]} $PartName_

    let "i++"
done

3. 使用重定向

所以我又换了一种方法,直接重定向,结果是可行的。
上面两个问题都解决了

while read PartName_ PartStart_ PartEnd_ PartFS_
do
    PartName[i]=$PartName_
    PartStart[i]=$PartStart_
    PartEnd[i]=$PartEnd_
    PartFS[i]=$PartFS_
    echo $i ${PartName[$i]} $PartName_

    let "i++"
done <ImageConfig.cfg

使用以下测试语句可以发现在循环外也可以正确读到了

PartNum=${#PartName[@]}
for ((i=0;i<$PartNum;i++))
do
    echo  ${PartName[i]} ${PartStart[$i]} ${PartEnd[$i]} ${PartFS[$i]} 
done

最终简化

因为赋值不是问题,那么$PartName_这种中间变量就变得没有意义了,直接删掉

while read PartName[i] PartStart[i] PartEnd[i] PartFS[i]
do
    let "i++"
done <ImageConfig.cfg

PartNum=${#PartName[@]}
for ((i=0;i<$PartNum;i++))
do
    echo  ${PartName[i]} ${PartStart[$i]} ${PartEnd[$i]} ${PartFS[$i]} 
done

结论

使用形如

i=0
while read Array1[i] Array2[i] Array2[i] 
do
	let "i++"
done <YourConfig.cfg

可以快速拆分空格区分的参数,按行赋值。
简单又快乐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idk500

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值