NoIFS 使用shell讀取cfg並拆成陣列

2021-10-20 18:32:34 字數 2047 閱讀 5033

需要解析乙個文字,裡面描述了客戶分割槽引數,形式如下

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

我個人非常不喜歡修改ifs來自定義拆分陣列的方式,修改$ifs一定要成對出現,指令碼結束時要還原,不然系統就被你改了,那如果在指令碼執行中途出現意外,那就還原不了。就很煩,用了兩次直接pass了

這一段用的時候發現兩個很詭異的問題。

陣列我傳不出去。當這個迴圈結束後,所有賦值都消失了。

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_

let"i++"

done

所以我又換了一種方法,直接重定向,結果是可行的。

上面兩個問題都解決了

while

read partname_ partstart_ partend_ partfs_

do partname[i]

=$partname_

partstart[i]

=$partstart_

partend[i]

=$partend_

partfs[i]

=$partfs_

echo$i$

$partname_

let"i++"

done

partnum=

$for

((i=

0;i<$partnum;i++

))do

echo$$

$$done

因為賦值不是問題,那麼$partname_這種中間變數就變得沒有意義了,直接刪掉

while

read partname[i] partstart[i] partend[i] partfs[i]

dolet

"i++"

done

partnum=

$for

((i=

0;i<$partnum;i++

))do

echo$$

$$done

使用形如

i=0

while

read array1[i] array2[i] array2[i]

dolet

"i++"

done

簡單又快樂

使用shell按行讀取檔案

在shell裡面,按行讀取檔案得注意設定環境變數ifs,否則無法正確讀入。具體例子如下 oldifs ifs ifs n file home xx txt in file home in for pattern in cat do grep v e pattern done ifs oldifs要按...

shell讀取文字

for迴圈和while迴圈按行讀取 示例 bin bash 適用於工作日誌文字中某特殊列值處理 awk data.txt mydata.txt 取第三列的值儲存 len cat data.txt wc l 文字行數計算 i 1 while i len 1 dosed n p mydata.txt i...

C 讀取PDF PDFBox使用

這個絕對是個好 將以上4個檔案引用到專案中,在檔案中需要引入以下2個命名空間 using org.pdfbox.pdmodel using org.pdfbox.util 三 api的使用方法 using system.io using system.text using org.pdfbox.pd...