使用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
这一段用的时候发现两个很诡异的问题。
- 数组我传不出去。当这个循环结束后,所有赋值都消失了。
i变回了0,数组没有任何值
猜想是否 cat 管道,赋值是在另一个空间完成,变量没有留到主空间来 - 如果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