戀上shell程式設計

jlttt發表於2008-06-25

最近有點迷戀shell了。呵呵,不過我也只是皮毛,就把我的所知寫在這裡吧。

附上晶晶小妹的一段shell,慢慢品位吧~~

0 #!/bin/bash
1 # 指令碼名:mystat 用途:收集vmstat 資料到my_os_stat 表中
2 # 命令格式: ./mystat 間隔時間 次數
3 # 省略次數,將會無限制執行。 省略間隔時間,將使用預設時間300 秒(即5 分鐘)
4 i=1
5 k="$1"
6 j="$2"
7 if [ -z "$1" ]
8 then
9 k=300
10 fi
11 if [ -z "$2" ]
12 then
13 j=2
14 fi
15 while (( i <= j ))
16 do
17 vmstat $k 2|sed 1,3d|tr -s " "|{
18 read a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16;
19 sqlplus scott/password << EOF
20 insert into my_os_stat values(sysdate,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,
21 $a10,$a11,$a12,$a13,$a14,$a15,$a16);
22 commit;
23 exit
24 EOF
25 # 注意,在上面的迴圈內,EOF 前不可以有空格。
26 }
27 if [ -n "$2" ]
28 then
29 let i=i+1
30 fi
31 done

我在研究此段程式碼的時候,對if 裡的-z和-n,困惑了很久,經過不懈努力終於解開謎團。

第7和11行,-z是判斷是否為空值,如果為空,執行then

第27行,-n是判斷是否有值,如果有值,執行then

雖然-z和-n意思相近,不過很容易混淆,我就在這栽了跟斗。

注意:

1. "|"代表"管道",即不將vmstat 的結果傳送的螢幕上,而是傳遞給後面的命令處理。

2. sed 1,3d 的作用,是將vmstat 傳遞過來的結果進行處理,刪除1 至3 行。d 的意思是刪除,1,3 是刪除1 至3 行。

3. 接下來,結果會被透過管道,傳遞給tr -s " "命令,這個命令的作用是將重複的空格壓縮為1 個

4. 接下來,結果將會以管道的形式,傳遞給下一個命令。下一命令是用{ }括起來的命令組合。read a1 a2 ...。a16,它從管道的前一個命令的輸出結果中,以空格為間隔,依次讀出每一個數字,按順序分別賦給a1,a2 等變數。當read 從管道的一端讀出資料到變數中後,各個變數的值無法在下一命令中使用。因此,需要用一對括號{},將read 和後面的命令組合起來,這樣後面的命令就可以使用read 中的變數了。因此,我們可以暫時的將大括號中的所有命令,理解為一個整體。需要
注意的是大括號中的各命令,用“;”號間隔。

5. <束,從第8 行之後的命令,又將傳遞給Shell。

6. “$1”,“$2”它們兩個,分別代表第一與第二個命令列引數。

以上6點,需要注意。同時此段指令碼的作用應該已經很明瞭了,是按照vmstat中輸入的引數將內容處理後插入到my_os_stat中.如果vmstat引數沒有輸入或輸入不全,此段指令碼將陷入死迴圈,將持續不斷的將vmstat資訊插入到my_os_stat中。

好了,以上程式碼解析完了,留此紀念,供日後參考。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9533994/viewspace-1006093/,如需轉載,請註明出處,否則將追究法律責任。

相關文章