星期三, 7月 08, 2009

Bash Shell Script Notes

Bash Shell Script Notes

(Keywords)保留字:

! esac select }
case fi then [[
do for until ]]
done function while
elif if time
else in {


預設變數與環境變數:

    $?              上個指令執行的回傳值 (0 = 成功執行)
    $IFS            Shell Script 參數間格字元 (空白、Tab 等)
    $0              Shell Script File Name
    $1, $2 etc...   First Parameter, Second Parameter etc...
    $#              Number of Parameters
    $$              PID of the Shell Script


自定變數:

    定義: foo=123 或 foo="Hello, World"
    使用: $foo 或 ${foo}
    移除: foo= 或 unset foo
    注意: 定義時變數名稱與 = 之間不可以有空白,如 foo = 123 是錯誤的。


test 與 [ 條件判斷:

    通常條件判斷會用 test,test 可用來做很多種比對,像比較兩個整數、判斷檔案存在與否等等。
    語法:

        test EXPRESSION
        test
        [ EXPRESSION ]
        [ ]
        [ OPTION

    實際上 [ 通常是 test 的連結(Fedora7 是獨立的),可以用 ls 來觀察如:
        ls -l /usr/bin/[ /usr/bin/test

    通常我們還會用 ] 來對應前面的 [。

    test 常用參數:

    -e FILE                 檔案存在
    -f FILE                 檔案存在並且一般檔案 (較常用)
    -d FILE                 目錄存在
    -h FILE                 檔案是否為 symbol link (同 -L)
    -x FILE                 檔案是否可執行
    -s FILE                 檔案大小不是零

    -n STRING               字串非零 (not zero)
    -z STRING               字串為零 (zero string)

    INTEGER1 -eq INTEGER2   INTEGER1 等於 INTEGER2
    INTEGER1 -ge INTEGER2   INTEGER1 大於等於 INTEGER2
    INTEGER1 -gt INTEGER2   INTEGER1 大於 INTEGER2
    INTEGER1 -le INTEGER2   INTEGER1 小於等於 INTEGER2
    INTEGER1 -lt INTEGER2   INTEGER1 小於 INTEGER2
    INTEGER1 -ne INTEGER2   INTEGER1 不等於 INTEGER2

    其他的可看 man test。


if:

    然後可以搭配 if 來使用,if 語法如下:

    if ...condition...; then
        ...statements...
    else
        ...statements...
    elif
        ...statements...
    fi

    範例:
    XFILE=/bin/ls
    if [ -x ${XFILE} ]; then
        $XFILE
    else
        echo "not executable file"
    fi


switch/case:

    case ...variable... in
        ... pattern | patterns ... )
            ...statements...
        ;;
    esac


for 迴圈:

    for ...variable... in ...variables...; do
        ...statements...
    done


while 迴圈:

    while ...condition...; do
        ...statements...
    done

    until ...condition...; do
        ...statements...
    done


其他迴圈控制:

    break
    continue
    return

    這三個用法與 C 基本上都一樣。
    return 後未加數值,會回應最後一個取得的回應值。

沒有留言: