我有一支程式重複的執行特定的命令,去撈出我要的欄位內容,接著我要依據這個內容再去進行另一個資料刪除的動作。剛開始因為系統裡的資料不多,所以就快速的僅利用while迴圈來實作,也就是在迴圈內放入我要做的動作,讓他一一的去撈欄位、進行處理;而停止條件就是當所有的資料都被刪除了之後,因為再也撈不到欄位的內容而停止while迴圈。
Timestamp=`query operations`
while [ $Timestamp ]; do
delete data as $Timestamp from DB
Timestamp=`query operations`
done
這樣的程式不漂亮的地方在於,如果我的資料很多,而query的動作很花時間的話,這樣程式就要執行很久,而且系統因為要不斷的query而變得很忙碌(第4行)。所以我就著手加以改善,方法就是利用array的特性,我只需進行一次query,把所有我要的欄位內容一次抓出來存到array中,再透過迴圈去進行資料刪除的動作即可。
Timestamp=`query operations`
IFS=$'\n'
ARRAY=( $Timestamp )
let i=0
while [ $i -lt ${#ARRAY[@]} ]; do
delete data as ${ARRAY[$i]} from DB
let i++
done
第2行的動作是指示array用換行字元(\n)來切割輸出的欄位內容,以好在第3行將這些資料放入array中。接著在while迴圈中,取出每個array的內容(${ARRAY[$i]})去進行資料刪除的動作,這樣我僅需要進行一次query(第1行),狠狠的省下n倍的時間。
[系列文章]
我與BASH的每一天 - [1]利用bc命令來取得數字字串中的特定欄位值
我與BASH的每一天 - [2]直取字串變數中的特定欄位值
我與BASH的每一天 - [3] 利用awk來擷取特定欄位
我與BASH的每一天 - [4] 利用awk來擷取特定欄位-2
我與BASH的每一天 - [5] 利用awk來擷取特定欄位-3
我與BASH的每一天 - [6] 利用cut來擷取特定欄位
我與BASH的每一天 - [7] grep指令的妙用 - 1
我與BASH的每一天 - [8] grep指令的妙用 - 2
我與BASH的每一天 - [9] 正規化表示法 - 1
我與BASH的每一天 - [10] 正規化表示法 - 2
我與BASH的每一天 - [11] 正規化表示法 - 3
我與BASH的每一天 - [12] 正規化表示法 - 4
我與BASH的每一天 - [13] sed - 1
我與BASH的每一天 - [14] sed - 2
我與BASH的每一天 - [15] sed - 3
我與BASH的每一天 - [16] 多條件選擇 - case
我與BASH的每一天 - [17] 建立自動化的暫存檔 - mktemp
我與BASH的每一天 - [18] if 條件判斷的正規化用法
我與BASH的每一天 - [19] 複合式的條件判斷
我與BASH的每一天 - [20] 代表參數位置的特殊變數符號與shift
我與BASH的每一天 - [21] 特殊的參數變數符號: $@ 與 $*