2015/03/18

bash 流程控制

Include

我們的 shell script 大到一定程度時,用單一檔案會變得不好管理維護,於是會把 shell script 寫成多個檔案,再用 include 的方式把其他檔案加進來。
bash 的 include 是用 . 開頭,後面接檔名。例如
#!/bin/sh
. /etc/init.d/getmibs
就會將 /etc/init.d/getmibs 的內容插進來。而取得 mibs 內容的 script 就用 /etc/init.d/getmibs 來維護就好,整個 script 看起來會變得很乾淨。

Function

例用 function 來結構化 script,可以增加 script 的可讀性,例如:
#!/bin/sh
hello()
{
    echo "Hello World!"
}
hello

夾帶參數

呼叫 function 時如果有參數,會在 function 裡面以 $1, $2.... 呈現,因為字串在 shell script 的定義並不是很嚴謹,所以要特別注意字串的傳遞。例如:
#!/bin/sh
hello()
{
    echo "----------"
    echo "var1 = $1"
    echo "var2 = $2"
}
hello Hello World!
hello "Hello World!"
從上面的例子觀察其結果,會發現第二次呼叫會把 "Hello World!" 當成一個變數來用,而第一是呼叫的會變成兩個,不得不防。

if 條件式

if [ 條件 ]; then
    條件成立時執行的內容
fi
if [ 條件 ]; then
    條件成立時執行的內容
else
    條件不成立時執行的內容
fi
if [ 條件1 ]; then
    條件1 成立時執行的內容
elif [ 條件2 ]; then
    條件1 不成立而條件2 成立時執行的內容
else
    條件1 跟條件2 都不成立時執行的內容
fi

case 條件式

case "$變數" in
    "值1")
        當 "$變數" == "值1" 時執行的內容
        ;;
    "值2")
        當 "$變數" == "值2" 時執行的內容
        ;;
    ... ...
    *)
        以上都不滿足時執行的內容
        ;;
esac

while / until 迴圈

while [ 條件 ]
do
    迴圈執行的內容
done
until [ 條件 ]
do
    迴圈執行的內容
done
while 是當條件成立時,執行回圈的內容,而 until 則是執行到條件成立時退出。迴圈執行期間也可以用 break 跳離迴圈。

for xxx in ooo 迴圈

for 變數 in 值1 值2 值3 ...
do
    迴圈執行內容
done
第一次執行迴圈內容時 $變數=值,第二次 $變數=值2 ...,值到所有變數都跑過之後結束。同樣要注意字串的處理。例如
#!/bin/sh
DNS1=8.8.8.8
DNS2=8.8.4.4
DNS3=0.0.0.0
for DNS_ADDR in $DNS1 $DNS2 $DNS3
do
    echo "DNS_ADDR=$DNS_ADDR"
done
for DNS_ADDR in "$DNS1 $DNS2 $DNS3"
do
    echo "DNS_ADDR=$DNS_ADDR"
done

數字迴圈
for 變數 in {開始..結束}
do
    迴圈執行內容
done

例如:
#!/bin/sh
for i in {1..65535}
do
   echo "$i time"
done

沒有留言: