學習 Shell Scripts
时间:2006-01-27 来源:xwq_007
鳥哥的 Linux 私房菜
支持自由軟體,請愛用 firefox 瀏覽本網頁


支持自由軟體,請愛用 firefox 瀏覽本網頁







學習 Shell Scripts
切換解析度為 800x600
最近更新日期:2005/08/29
1. 什麼是 Shell Script 1.1 幹嘛學習 shell scripts? 1.2 第一支 script 的撰寫與執行 1.3 撰寫 shell script 的良好習慣建立 2. 簡單的 shell script 練習: 3. 善用判斷式: 3.1 利用 test 指令的測試功能 3.2 利用判斷符號 [ ] 3.3 Shell script 的預設變數($0, $1...) 4. 條件判斷式: 4.1 利用 if .... then 4.2 利用 case ..... esac 判斷 4.3 利用 function 功能 5. 迴圈 (loop) 5.1 while....do....done, until....do....done 5.2 for...do...done 6. shell script 的追蹤與 debug 7. 本章習題練習 ![]() 這個有趣的問題趕緊來回答看看,什麼是 shell script 呢? shell 我們在 認識 bash 當中已經提過了,那是一個文字介面底下讓我們與系統溝通的一個工具介面,那麼 script 是啥? 字面上的意義, script 是『腳本、劇本』的意思。整句話是說, shell script 是針對 shell 所寫的『劇本!』 什麼東西啊?呵呵!其實, shell script 是利用 shell 的功能所寫的一個『程式 (program)』,這個程式是使用純文字檔,將一些 shell 的語法與指令寫在裡面, 搭配正規表示法、管線命令與資料流重導向等功能,以達到我們所想要的處理目的。 所以,簡單的說, shell script 就像是早期 DOS 年代的批次檔 (.bat) ,最簡單的功能就是將許多指令彙整寫在一起, 讓使用者很輕易的就能夠 one touch (執行一個檔案 "shell script" ,就能夠一次執行多個指令), 而, shell script 更提供陣列、迴圈、條件與邏輯判斷等重要功能,讓使用者也可以直接以 shell 來撰寫程式,而不必使用類似 C 程式語言等傳統程式撰寫的語法呢! 那,這麼說您可以瞭解了嗎?是的! shell script 可以簡單的被看成是批次檔, 也可以被說成是一個程式語言,且這個程式語言由於都是利用 shell 與相關工具指令, 所以不需要編譯即可執行,且擁有不錯的除錯 (debug) 工具,所以,他可以幫助系統管理員快速的管理好主機。 ![]() 這是個好問題,我又幹嘛一定要學 shell script ?我又不是資訊人,沒有寫程式的概念, 那我幹嘛還要學 shell script 呢?不要學可不可以啊?呵呵~如果 Linux 對您而言, 您只是想要『會用』而已,那麼,不需要學 shell script 也還無所謂,這部分先給他跳過去, 等到有空的時候,再來好好的瞧一瞧。但是,如果您是真的想要玩清楚 Linux 的來龍去脈, 那麼 shell script 就不可不知,為什麼呢?因為:
![]() 如同前面講到的, shell script 其實就是純文字檔 (ASCII) ,我們可以編輯這個檔案, 然後讓這個檔案來幫我們一次執行多個指令,或者是利用一些運算與邏輯判斷來幫我們達成某些功能。 所以啦,要編輯這個檔案的內容時,當然就需要具備有 bash shell 指令下達的相關認識。 我們說過,要下達指令需要注意的事項在 bash 章節內已經提過, 在 shell script 的撰寫同樣需要用到這些注意事項的:
那,為何 sh shell.sh 也可以執行呢?這是因為 /bin/sh 其實就是 /bin/bash , 使用 sh shell.sh 亦即告訴系統,我想要直接以 bash 的功能來執行 shell.sh 這個檔案內的相關指令的意思。 而我們也可以利用 sh 的參數,如 -n 及 -x 來檢查與追蹤 shell.sh 的語法是否正確呢! ^_^
![]() 一個良好習慣的養成是很重要的~大家在剛開始撰寫程式的時候,最容易忽略這部分, 認為程式寫出來就好了,其他的不重要。其實,如果程式的說明能夠更清楚, 那麼對您自己是有很大的幫助的。 舉例來說,鳥哥自己為了自己的需求,曾經撰寫了不少的 script 來幫我進行主機 IP 的偵測啊、 登錄檔分析與管理啊、自動上傳下載重要設定檔啊等等的,不過,早期就是因為太懶了, 管理的主機又太多了,常常同一個程式在不同的主機上面進行更改,到最後,到底哪一支才是最新的都記不起來, 而且,重點是,我到底是改了哪裡??為什麼做那樣的修改?都忘的一乾二淨~真要命~ 所以,後來鳥哥在寫程式的時候,通常會比較仔細的將程式的設計過程給他記錄下來, 而且還會記錄一些歷史紀錄,如此一來,好多了~ 至少很容易知道我修改了哪些資料,以及程式修改的理念與邏輯概念等等, 在維護上面是輕鬆很多很多的喔! 另外,在一些環境的設定上面,畢竟每個人的環境都不相同,為了取得較佳的執行環境, 我都會自行先定義好一些一定會被用到的環境變數,例如 PATH 這個玩意兒! 這樣比較好啦~所以說,建議您一定要養成良好的 script 撰寫習慣, 在每個 script 的檔頭處記錄好:
![]() 在第一支 shell script 撰寫完畢之後,相信您應該具有基本的撰寫功力了。 接下來,在開始更深入的程式概念之前,我們先來玩一些比較有趣的簡單的小範例好了。 底下的範例中,達成結果的方式相當的多,建議您先自行撰寫看看,寫完之後再與鳥哥寫的內容比對, 這樣才能更加深概念喔!好!不囉唆,我們就一個一個來玩吧!
![]() 在 bash 章節中,我們提到過 $? 這個變數所代表的意義, 此外,也透過 && 及 || 來作為前一個指令是否能夠成功進行的一個參考。 那麼,如果我想要知道 /dmtsai 這個目錄是否存在時,難道一定要使用 ls 來執行, 然後再以 $? 來判斷執行成果嗎?呵呵!當然不需要! 我們可以透過『 test 』這個指令來偵測呢! ![]() 當我要檢測系統上面某些檔案或者是相關的屬性時,利用 test 這個指令來工作, 真是好用得不得了,舉例來說,我要檢查 /dmtsai 是否存在時,使用:
OK!現在我們就利用 test 來幫我們寫幾個簡單的例子。首先,判斷一下, 讓使用者輸入一個檔名,我們判斷:
![]() 除了我們很喜歡使用的 test 之外,其實,我們還可以利用判斷符號『 [ ] 』來進行資料的判斷呢! 舉例來說,如果我想要知道 $HOME 這個變數是否為空的,可以這樣做:
![]() 其實,當我們執行一個 shell script 時,在這個 shell script 裡面就已將幫我們做好一些可用的變數了。 舉例來說,在不久的將來,您就會發現,當我們要啟動一個系統服務時,可能會下達類似這樣的指令:
![]() 只要講到『程式』的話,那麼條件判斷式,亦即是『 if then 』這種判別式肯定一定要學習的! 因為很多時候,我們都必須要依據某些資料來判斷程式該如何進行。舉例來說,我們在上頭不是有練習當使用者輸入 Y/N 時,必須要執行不同的訊息輸出嗎?簡單的方式可以利用 && 與 || ,但如果我還想要執行一堆指令呢? 那真的得要 if then 來幫忙囉~底下我們就來聊一聊! ![]() 這個 if .... then 是最常見的條件判斷式了~簡單的說,就是當符合某個條件判斷的時候, 就予以進行某項工作就是了。我們可以簡單的這樣看:
![]() 上個小節提到的『 if .... then .... fi 』對於變數的判斷中, 是以比對的方式來分辨的,如果符合狀態就進行某些行為,並且透過較多層次 ( 就是 elif ... ) 的方式來進行多個變數的程式碼撰寫,譬如 sh08.sh 那個小程式,就是用這樣的方式來的囉。 好,那麼萬一我有多個既定的變數內容,例如 sh08.sh 當中,我所需要的變數就是 "hello" 及空字串兩個, 那麼我只要針對這兩個變數來設定狀況就好了對吧?!那麼可以使用什麼方式來設計呢? 呵呵~就用 case ... in .... esac 吧~,他的語法如下:
一般來說,使用『 case $變數 in 』這個語法中,當中的那個 $變數 大致有兩種取得的方式:
![]() 什麼是『函數 (function)』功能啊?簡單的說,其實, 函數可以在 shell script 當中做出一個類似自訂執行指令的東西,最大的功能是, 可以簡化我們很多的程式碼~舉例來說,上面的 sh11.sh 當中,每個輸入結果 one, two, three 其實輸出的內容都一樣啊~那麼我就可以使用 function 來簡化了! function 的語法是這樣的:
另外, function 也是擁有內建變數的~他的內建變數與 shell script 很類似, 函數名稱代表示 $0 ,而後續接的變數也是以 $1, $2... 來取代的~ 這裡很容易搞錯喔~因為『 function fname() { 程式段 } 』內的 $0, $1... 等等與 shell script 的 $0 是不同的。以上面 sh11-2.sh 來說,假如我下達:『 sh sh11-2.sh one 』 這表示在 shell script 內的 $1 為 "one" 這個字串。但是在 printit() 內的 $1 則與這個 one 無關。 我們將上面的例子再次的改寫一下,讓您更清楚!
![]() 除了 if...then...fi 這種條件判斷式之外,迴圈可能是程式當中最重要的一環了~ 迴圈可以不斷的執行某個程式段落,直到使用者設定的條件達成為止。 所以,重點是那個『條件的達成』是什麼。底下我們就來談一談: ![]() 一般來說,迴圈最常見的就是底下這兩種狀態了:
![]() 相對於 while, until 的迴圈方式是必須要『符合某個條件』的狀態, for 這種語法,則是『 已經知道要進行幾次迴圈』的狀態!他的語法是:
![]() scripts 在執行之前,最怕的就是出現問題了!那麼我們如何 debug 呢?有沒有辦法不需要透過直接執行該 scripts 就可以來判斷是否有問題呢!?呵呵! 當然是有的!我們就直接以 bash 的相關參數來進行判斷吧!
熟悉 sh 的用法,將可以使您在管理 Linux 的過程中得心應手!至於在 Shell scripts 的學習方法上面,需要『多看、多模仿、並加以修改成自己的樣式!』 是最快的學習手段了!網路上有相當多的朋友在開發一些相當有用的 scripts ,若是您可以將對方的 scripts 拿來,並且改成適合自己主機的樣子!那麼學習的效果會是最快的呢! 另外,我們 Linux 系統本來就有很多的啟動 script ,如果您想要知道每個 script 所代表的功能是什麼? 可以直接以 vi 進入該 script 去查閱一下,通常立刻就知道該 script 的目的了。 舉例來說,我們的 Linux 裡頭有個檔案名稱為: /etc/init.d/portmap ,這個 script 是幹嘛用的? 利用 vi 去查閱最前面的幾行字,他出現如下資訊:
另外,本章所有的範例都可以在 http://linux.vbird.org/linux_basic/0340bashshell-scripts/scripts.tgz 裡頭找到喔!加油~ ![]() ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
2003/02/10:重新編排與加入 FAQ 2005/08/29:將舊的文章移動到 這裡 了。 2005/08/29:呼呼~加入了一些比較有趣的練習題~比第一版要難的多~大家多多玩一玩喔~ 2002/06/27以來統計人數 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||







本網頁主要以 firefox 配合解析度 1024x768 作為設計依據
http://linux.vbird.org is designed by VBird during 2001-2005. Aerosol Lab.
http://linux.vbird.org is designed by VBird during 2001-2005. Aerosol Lab.
相关阅读 更多 +
排行榜 更多 +