Include
我們的 shell script 大到一定程度時,用單一檔案會變得不好管理維護,於是會把 shell script 寫成多個檔案,再用 include 的方式把其他檔案加進來。
bash 的 include 是用 . 開頭,後面接檔名。例如
#!/bin/sh
. /etc/init.d/getmibs
. /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
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()
{
echo "----------"
echo "var1 = $1"
echo "var2 = $2"
}
hello Hello World!
hello "Hello World!"
從上面的例子觀察其結果,會發現第二次呼叫會把 "Hello World!" 當成一個變數來用,而第一是呼叫的會變成兩個,不得不防。
if 條件式
if [ 條件 ]; then
條件成立時執行的內容
fi
條件成立時執行的內容
fi
if [ 條件 ]; then
條件成立時執行的內容
else
條件不成立時執行的內容
fi
條件成立時執行的內容
else
條件不成立時執行的內容
fi
if [ 條件1 ]; then
條件1 成立時執行的內容
elif [ 條件2 ]; then
條件1 不成立而條件2 成立時執行的內容
else
條件1 跟條件2 都不成立時執行的內容
fi
條件1 成立時執行的內容
elif [ 條件2 ]; then
條件1 不成立而條件2 成立時執行的內容
else
條件1 跟條件2 都不成立時執行的內容
fi
case 條件式
case "$變數" in
"值1")
當 "$變數" == "值1" 時執行的內容
;;
"值2")
當 "$變數" == "值2" 時執行的內容
;;
... ...
*)
以上都不滿足時執行的內容
;;
esac
"值1")
當 "$變數" == "值1" 時執行的內容
;;
"值2")
當 "$變數" == "值2" 時執行的內容
;;
... ...
*)
以上都不滿足時執行的內容
;;
esac
while / until 迴圈
while [ 條件 ]
do
迴圈執行的內容
done
do
迴圈執行的內容
done
until [ 條件 ]
do
迴圈執行的內容
done
do
迴圈執行的內容
done
while 是當條件成立時,執行回圈的內容,而 until 則是執行到條件成立時退出。迴圈執行期間也可以用 break 跳離迴圈。
for xxx in ooo 迴圈
for 變數 in 值1 值2 值3 ...
do
迴圈執行內容
done
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"
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
數字迴圈
for 變數 in {開始..結束}
do
迴圈執行內容
done
例如:
#!/bin/sh
for i in {1..65535}
do
echo "$i time"
done
沒有留言:
張貼留言