系统相关
首页 > 系统相关> > 使用shell读取cfg并拆成数组

使用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

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

标签:拆成,shell,img,read,cfg,PartName,PartStart,PartEnd,PartFS
来源: https://blog.csdn.net/idk500/article/details/114273509