<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% #<==定義時間變量。
mysqldump -uroot -poldboy -a -b > d:\bak\"%date%".sql #<==備份資料庫資料。
rar.exe a -k -r -s -m1 d:\bak\"%date%".sql.rar d:\bak\"%date%".sql
#<==打包備份出來的資料庫資料。
del d:\bak\*.sql #<==删除未打包的無用資料庫資料。
rar.exe a -k -r -s -m1 d:\bak\"%date%"htdocs.rar d:\work\phpnow\htdocs
#<==打包站點目錄下的資料。
範例2-2:清除/var/log下messages日志檔案的簡單指令腳本。
把所有指令放在一個檔案裡,堆積起來後就形成了腳本,下面就是一個由最簡單的指令堆積而成的shell腳本。需要注意的是,必須使用root身份來運作這個腳本。
# 清除日志腳本, 版本 1。
cd /var/log
cat /dev/null>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 #<==$uid為0的使用者,即root使用者
# 腳本需要使用root使用者權限來運作,是以,對目前使用者進行判斷,對不合要求的使用者給出友好提示,并終止程式運作。
if [ "$uid" -ne "$root_uid" ] #<==如果目前使用者不是root,則不允許執行腳本。
then
echo "must be root to run this script." #<==給出提示後退出。
exit 1 #<==退出腳本。
fi
# 如果切換到指定目錄不成功,則給出提示,并終止程式運作。
cd $log_dir || {
echo "cannot change to necessary directory."
exit 1
}
# 經過上述兩個判斷後,此處的使用者權限和路徑應該就是對的了,隻有清空成功,才列印成功提示。
cat /dev/null>messages && {
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 > messages),若清理成功,則給出正确提示。
第四關,通關或失敗,分别給出相應的提示(echo輸出)。