看例子學 Shell Programming (4) – 小知識, 讀取多變數與字串比較

最近工作上用到了幾個之前不熟悉或覺得不重要的東西,才發現還蠻好用的。以前也許有在PC Linux 用過,或用蠻幹的達成,但這次在 embedded Linux 上功能沒這麼齊全、速度也有一點要求,所以才有機會學到這些新東西。

一次讀取多個變數

當我們要從文字檔或pipe取出幾個欄位儲存在內部變數時,之前都會用 echo + cut 的方式,來取得結果。當然這方法是可以,就是多花時間。因為每次取值多都是fork另一個process來執行動作,所以一次取一個內容的話,是挺浪費時間的。

此時我們可以用另一個方式讀取。使用read指令,read不只可以讀取使用者輸入,也可以從pipe中一次讀取數個變數。

例子裡面將變數直接一次讀入owner與filesize中。read 預設會以空白來當做分隔,來取得變數內容。我們也可以透過設定 IFS 變數,來指定要當做分隔的符號。

讀取 Excel CSV 檔案

Excel CSV 是一種變通用的文字檔,就是以逗號來當做欄位區格的記錄格式,可由 Excel 直接讀取或匯出。

CSV 範例

如果要從shell讀取裡面的內容,透過echo+cut,就麻煩了點。此時只要搭配 IFS + read,就可輕鬆讀取其它容了。

行 2: 設定 IFS 為逗號,這樣區分欄位就會以這個符號為準,以配合CSV的格式。

行 3: 一次讀出5個變數,並各別命令

行 4: 利用讀出的變數印出訊息

行 5: 從 list 檔案讀入

 

這個方式最大的好處不在於方便,而是在於速度,尤其是在處理大量資料時。

 

 字串做 Wildcard 比較

在 PC Linux 上的 BASH 功能相當的強大,有 array 也可以做字串的pattern match。但 busybox 上的 ash,雖然也不錯,但就沒這麼齊全了。前幾天碰到的一個問題就是要判斷某個變數裡是否含有特定字串,一開始想到的也是用 if 做一些萬用字元 (wildcard) 或正規表式法。

但一直沒找到方法,最後才在 stackoverflow 上看到說可以用 case 的方式來達成此功能。真的很妙,我是很少在用case (還是喜歡直接來個大的 if-then-else),它有這個功能雖然我以前知道,但還真沒想到可以這樣用。

 

 

Leave a Reply