ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

使用shell读取cfg并拆成数组

2021-03-01 23:01:57  阅读:197  来源: 互联网

标签:拆成 shell img read cfg PartName PartStart PartEnd PartFS


场景

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有