天天看點

跟老男孩學Linux運維:Shell程式設計實戰2.2 什麼是Shell腳本

<b>2.2 什麼是shell腳本</b>

<b></b>

了解了shell之後,再了解shell腳本就簡單了。當指令或程式語句不在指令行下執行,而是通過一個程式檔案來執行時,該程式就被稱為shell腳本。如果在shell腳本裡内置了很多條指令、語句及循環控制,然後将這些指令一次性執行完畢,這種通過檔案執行腳本的方式稱為非互動的方式。shell腳本類似于dos系統下的批處理程式(早期擴充名一般為“*.bat”)。使用者可以在shell腳本中敲入一系列的指令及指令語句組合。這些指令、變量和流程控制語句等有機地結合起來,就形成了一個功能強大的shell腳本。

下面是在windows下利用bat批處理程式開發的備份企業網站及資料庫資料的腳本範例。

範例2-1:在windows下利用bat批處理程式備份網站及資料庫資料的腳本。

@echo off

set date=%date:~0,4%-%date:~5,2%-%date:~8,2%            #&lt;==定義時間變量。

mysqldump -uroot -poldboy -a -b  &gt; d:\bak\"%date%".sql  #&lt;==備份資料庫資料。

rar.exe a -k -r -s -m1 d:\bak\"%date%".sql.rar d:\bak\"%date%".sql

#&lt;==打包備份出來的資料庫資料。

del d:\bak\*.sql #&lt;==删除未打包的無用資料庫資料。

rar.exe a -k -r -s -m1 d:\bak\"%date%"htdocs.rar d:\work\phpnow\htdocs

#&lt;==打包站點目錄下的資料。

範例2-2:清除/var/log下messages日志檔案的簡單指令腳本。

把所有指令放在一個檔案裡,堆積起來後就形成了腳本,下面就是一個由最簡單的指令堆積而成的shell腳本。需要注意的是,必須使用root身份來運作這個腳本。

# 清除日志腳本, 版本 1。

cd /var/log

cat /dev/null&gt;messages

echo "logs cleaned up."

提示: /var/log/messages是linux系統的日志檔案,很重要。

範例2-2所示的腳本其實是有一些問題的,具體如下:

1)如果不是root使用者,則無法執行腳本清理日志,并且會提示系統的權限報錯資訊。

2)沒有任何流程控制語句,簡單地說就是隻進行順序操作,沒有成功判斷和邏輯嚴密性。

範例2-3:寫一個包含指令、變量和流程控制的語句來清除/var/log下messages日志檔案的shell腳本。

# !/bin/bash

# 清除日志腳本, 版本 2

log_dir=/var/log

root_uid=0     #&lt;==$uid為0的使用者,即root使用者

# 腳本需要使用root使用者權限來運作,是以,對目前使用者進行判斷,對不合要求的使用者給出友好提示,并終止程式運作。

if [ "$uid" -ne "$root_uid" ] #&lt;==如果目前使用者不是root,則不允許執行腳本。

  then

    echo "must be root to run this script." #&lt;==給出提示後退出。

    exit 1 #&lt;==退出腳本。

fi

# 如果切換到指定目錄不成功,則給出提示,并終止程式運作。

cd $log_dir || {

    echo "cannot change to necessary directory."

    exit 1

}

# 經過上述兩個判斷後,此處的使用者權限和路徑應該就是對的了,隻有清空成功,才列印成功提示。

cat /dev/null&gt;messages &amp;&amp; {

    echo "logs cleaned up."

    exit 0  # 退出之前傳回0表示成功,傳回1表示失敗。

echo "logs cleaned up fail."

exit 1

初學者如果想要快速掌握shell腳本的編寫方法,最有效的思路就是采用電子遊戲中過關的方式,比如,對于範例2-3的腳本可以設計成如下幾關:

第一關,必須是root才能執行腳本,否則給出友好提示并終止腳本運作。

第二關,成功切換目錄(cd /var/log),否則給出友好提示并終止腳本運作。

第三關,清理日志(cat /dev/null &gt; messages),若清理成功,則給出正确提示。

第四關,通關或失敗,分别給出相應的提示(echo輸出)。