底下示範一個簡單的shell script程式範列
檢查資料夾是否存在
#!/bin/bash
#bash script 簡單範例,判斷資料夾是否存在
#test -d /var/www/agi-bin/
#test -d /var/www/
#test 檔案或資料夾存在,則 $? 內容為0,反之若不存在則 $? 內容為1
if [ -d /var/www/agi-bin/ -o -d /var/www/ ] ; then
# -o 為 or 縮寫,亦存在兩個條件,分別是 -d /var/www/agi-bin/ 和 /var/www/
# 上面裡的[ -d /var/www/agi-bin/ ] 功能等同於 test -d /var/www/agi-bin/
# $? 回傳值為0 則條件成立,執行 then 後面的內容
# $? 回傳值為1 則條件不成立,直接執行 else 後面的內容
echo "檢查資料夾有存在,可以開始搬移檔案"
#mv agi-bin/* /var/www/agi-bin/
#mv bin/ /var/www/
else
echo "/var/www/agi-bin/ 該資料夾不存在,是否忘了安裝apache?"
echo "請按 ctrl+c 來中止程式! 先安裝好 apache 再來"
echo "若您確定已有安裝 apache 了,則可自己建此目錄 /var/www/agi-bin/"
exit 0
fi
echo "程式繼續...."
以上是比較正規的寫法,若你判斷資料夾存與否之後要執行的指令比較少的話,你可以改用底下這種比較精簡的寫法
test -d /tmp/asteriskdb || mkdir /tmp/asteriskdb && cp -a /var/lib/asterisk/db/* /tmp/asteriskdb && chown -R asterisk.asterisk /tmp/asteriskdb
#以上這行指令是先判斷 /tmp/asteriskdb 此資料夾是否存在,若不存在則執行後面的 mkdir 指令, mkdir 執行成功的話則會接著執行 && 後面的指令,反之 && 後面的指令若有其中一個指令執行失敗的話,那麼在這個失敗指令後面的 && 所帶的指令都不會繼續執行下去。
說明:
例1:cmd1 && cmd2
簡單講就是&& 前面的指令cmd1執行成功($?=0),才會執行 && 後面的cmd2指令
例2:cmd1 || cmd2
說明: || 前面的指令cmd1執行失敗($?≠0),才會執行 || 後面的cmd2指令
這個 $?=0 等不等於零很不好記,教大家一個簡單的記法 0=ok 就很好記了
在執行 Shell Script 時,程式會自動產生一些變數:
變數名稱 | 說明 |
$? | 表示上一個指令的離開狀況,一般指令正常離開會傳回 0。不正常離開則會傳回 1、2 等數值。 |
$$ | 這一個 shell 的 process ID number |
$! | 最後一個在背景執行的程式的 process number |
$- | 這個參數包含了傳遞給 shell 旗標 (flag)。 |
$1 | 代表第一個參數,$2 則為第二個參數,依此類推。而 $0 為這個 shell script 的檔名。 |
$# | 執行時,給這個 Shell Script 參數的個數 |
$* | 包含所有輸入的參數,$@ 即代表 $1, $2,….直到所有參數結束。$* 將所有參數無間隔的連在一起,存成一個單一的參數。也就是說 $* 代表了 “$1 $2 $3…”。 |
$@ | 包含所有輸入的參數,$@ 即代表 $1, $2,….直到所有參數結束。$@ 用將所有參數以空白為間隔,存在 $@ 中。也就是說 $@ 代表了 “$1” “$2” “$3″….。 |
[note]參考資料:twbsd.org、Bash Shell Script教學與心得、