天天看點

進階Bash腳本程式設計入門

最近在看《advanced bash scripting guide》這本書,第二章舉了一個清除日志的例子,來講述如何使用bash進行程式設計并聊到了一些程式設計規範。本文主要是基于這部分内容記錄我的讀書筆記并整理一些相關知識點。

說到清除日志,你可以使用下面指令來完成清除/var/log下的log檔案這件事情:

更簡單的清除日志方法是:

注意: /var/log/messages 記錄系統報錯資訊 /var/log/wtmp 記錄系統登入資訊

在bash程式設計時,腳本通常都是放到一個檔案裡面,該檔案可以有字尾名也可以沒有,例如,你可以将該檔案命名為cleanlog,然後在檔案頭聲明一個指令解釋器,這裡是<code>#!/bin/bash</code>:

當然,還可以使用其他的指令行解釋器,例如:

說明:

<code>#!</code> 後面的路徑必須真實存在,否則運作時會提示<code>command not found的錯誤</code>。

在unix系統中,在<code>!</code>後邊需要一個空格。

如果腳本中還包含有其他的<code>#!</code>行,那麼bash将會把它看成是一個一般的注釋行。

上面代碼将/var/log定義為變量,這樣會比把代碼寫死好很多,因為如果你可能想修改為其他目錄,隻需要修改變量的值就可以。

對于/var/log目錄,一般使用者沒有通路權限,故需要使用root使用者來運作上面腳本,另外,使用者不一定有修改目錄的權限,是以需要增強代碼,做一些判斷。

上面代碼一樣定義了一些變量,然後加了兩個判斷,去檢查腳本運作中可能出現的錯誤并列印錯誤說明。如果腳本運作錯誤,則程式會退出并傳回一個錯誤碼,不同類型的錯誤對應的錯誤碼不一樣,這樣便于識别錯誤原因;如果腳本運作正常,則正常退出,預設傳回碼為0。

對于<code>cd $log_dir</code>操作判斷是否執行成功,更有效的做法是:

通常,我們可能不想全部清除日志,而是保留最後幾行日志,這樣就需要給腳本傳入參數:

上面使用if else來判斷是否有輸入參數,一個更好的檢測指令行參數的方式是使用正規表達式做判斷,以檢查輸入參數的合法性:

編寫完腳本之後,你可以使用<code>sh scriptname</code>或者<code>bash scriptname</code>來調用這個腳本。不推薦使用<code>sh &lt;scriptname</code>,因為這禁用了腳本從stdin中讀資料的功能。更友善的方法是讓腳本本身就具有 可執行權限,通過<code>chmod</code>指令可以修改。比如:

或者:

既然腳本已經具有了可執行權限,現在你可以使用<code>./scriptname</code>來測試這個腳本了。如果這個腳本以一個<code>#!</code>行開頭,那麼腳本将會調用合适的指令解釋器來運作。

這樣一個簡單的腳本就編寫完成并能運作了,從這個例子中,我們可以學到bash程式設計的一些代碼規範:

使用變量

腳本運作中,需要做一些異常判斷