編寫:
shell 指令碼其實就是純文字檔案 (ASCII) ,我們可以編輯這個檔案, 然後讓這個檔案來幫我們一次執行多個指令,或者是利用一些運算與邏輯判斷來幫我們達成某些功能。在 shell 指令碼的撰寫同樣需要用到這些注意事項的:
1. 指令與參數間的多個空白會被忽略掉
2. 空白行與定位字元也將被忽略掉
3. 如果讀取到一個 Enter 符號 ( CR ),就嘗試開始執行該行命令;
4. 至於如果一行的內容太多,則可以使用 \ 來延伸至下一行;
5. 任何加在 # 後面的字,將全部被視為批註文字而被忽略。
執行:
如此一來,我們在 script 內所撰寫的程式,就會被從左至右從上到下一行一行的執行。好了,那麼這個程式假設檔案名稱是 shell.sh 好了,如何執行這個指令碼。很簡單,可以有底下幾個方法:
1.將 shell.sh 加上可讀與執行 (rx) 的許可權,然後就能夠以 ./shell.sh 來執行了;
2.直接以 sh shell.sh 的方式來直接執行即可。
反正重點就是要讓那個 shell.sh 內的指令可以被執行的意思啦。那我為何需要使用 ./shell.sh 來下達指令。 還記得我們在 bash 裡面一直強調的,指令是否能夠被執行與 PATH 這個環境變數有關, 所以,要執行目前的目錄下的檔案就需要加上 ./ 這個目錄啦。另外,其實您也可以將 shell.sh 放在您家目錄下的 ~/bin 這個目錄中,然後利用 PATH="$PATH":~/bin 的設定, 就能夠直接執行您的指令碼,執行命令: shell.sh
為何 sh shell.sh 也可以執行呢。這是因為 /bin/sh 其實就是 /bin/bash , 使用 sh shell.sh 亦即告訴系統,我想要直接以 bash 的功能來執行 shell.sh 這個檔案內的相關指令的意思。 而我們也可以利用 sh 的參數,如 -n 及 -x 來檢查與追蹤 shell.sh 的文法是否正確呢。
指令碼執行個體:
[root@linux ~]# mkdir scripts; cd scripts
[root@linux scripts]# vi sh01.sh
#!/bin/bash
# Program:
# This program is used to show "Hello World !" in screen.
# History:
# 2005/08/23 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World ! \a \n"
exit 0
將所有的撰寫的 script 放置到您家目錄的 ~/scripts 這個目錄內, 比較好管理啦。上面的寫法當中,我主要將整個程式的撰寫分成數段,大致是這樣:
1. 第一行 #!/bin/bash 在宣告這個 script 使用的 shell 名稱: 因為我們使用的是 bash ,所以,必須要以『 #!/bin/bash 』來宣告這個檔案內的文法使用 bash 的文法。那麼當這個程式被執行時,他就能夠載入 bash 的相關環境設定檔, 並且執行 bash 來使我們底下的指令能夠執行。這很重要的。(在很多狀況中,如果沒有設定好這一行, 那麼該程式很可能會無法執行,因為系統可能無法判斷該程式需要使用什麼 shell 來執行啊。)
2. 程式內容的宣告: 整個 script 當中,除了第一行的 #! 是用來宣告 shell 的之外,其它的 # 都是『批註』用途。 所以上面的程式當中,第二行以下就是用來說明整個程式的狀態。一般來說, 建議您一定要養成說明該 script 的:1. 內容與功能; 2. 版本資訊; 3. 作者與聯絡方式; 4. 建檔日期;5. 曆史紀錄 等等。這將有助於未來程式的改寫與 debug 呢。
3. 主要環境變數的宣告: 建議務必要將一些重要的環境變數設定好,如此一來,則可讓我們這支程式在進行時,可以直接下達指令, 而不必寫絕對路徑呢。比較好啦,且環境變數只在當前shell生效,不影響系統shell
4. 主要程式部分 就將主要的程式寫好即可。在這個例子當中,就是 echo 那一行啦。
5. 執行成果告知 是否記得我們在 bash 裡面要討論一個指令的執行成功與否,可以使用 $? 這個變數來觀察~ 那麼我們也可以利用 exit 這個指令來讓程式中斷,並且回傳一個數值給系統。 在我們這個例子當中,我使用 exit 0 ,這代表離開 script ,並且回傳一個 0 給系統, 所以我執行完這個 script後,若接著下達 echo $? 則可得到 0 的值喔。 更聰明的讀者應該也知道了,呵呵。利用這個 exit n 的功能,我們還可以自訂錯誤訊息, 讓這支程式變得更加的 smart 呢。
接下來執行看看結果是怎樣吧。
[root@linux scripts]# sh sh01.sh
Hello World !
您會看到螢幕是這樣,而且應該還會聽到『咚』的一聲,為什麼呢。還記得前一章提到的 printf 吧。用 echo 接著那些特殊的按鍵也可以發生同樣的事情~ 不過, echo 必須要加上 -e 的參數才行。 另外,你也可以利用:『chmod a+x sh01.sh; ./sh01.sh』來執行這個 script 的呢。
以上摘自鳥哥經典,有少量修改