shell的結構分為三大類:順序結構、分支結構和迴圈結構
1. if語句
文法格式:
if
<語句序列A>
then
<語句序列B>
fi
如果語句序列A中的最後一個命令的傳回值為0,則執行語句序列B中的命令,然後繼續執行fi以後的命令;如果語句序列A中的最後一個命令的傳回值為非0,則跳轉到fi並且繼續執行fi以後的命令,注意,在這裡A執行結果為0認為是真。
if test –f funfilethen echo funfile existsfi
if [ -f funfile ]; then echo funfile exists echo hellofi
2. if-else語句
文法格式:
if
語句序列A
then
語句序列B
else
語句序列C
fi
如果語句序列A中的最後一個命令的傳回值為0,則執行語句序列B中的命令,然後繼續執行fi以後的命令;如果語句序列A中的最後一個命令的傳回值為非0,則執行語句序列C中的命令,然後繼續執行fi以後的命令。
任何命令的傳回值都可以作為判斷條件,也可以嵌套if語句,但必須保證if 和 fi配對。
if [ “$X” –lt 10 ]; then echo X is less than 10else if [ “$X” –gt 10 ]; then echo X is greater than 10 else echo X is equal to 10 fifi
也可以使用一種簡寫形式:elif來代替一個else if 嵌套。
3. case結構
文法結構:
case 單詞 in
模式A)
語句序列A
;;
模式B)
語句序列B
;;
...
esac
分支選擇是順序地對單詞和所提供的模式進行比較,如果一致,就執行後面的語句序列,然後跳轉到esac,並執行後續的語句。典型情況下,單詞是一個變數,而模式可以使用?, *等萬用字元。
case “$1” in start) start ;; stop) stop ;; *) echo “usage: $0 {start|stop}” ;;esac
4. while語句
文法格式:
while
語句序列A
do
語句序列B
done
語句功能:依次執行語句序列A中的命令,如果語句序列A最後一個命令的傳回值為0,則執行語句序列B,回到步驟1,重複上面的過程,直到語句序列A中的最後一個命令的傳回值為非0。
x=1while ((x <= 10))do echo x is $x let x=x+1done
這裡解釋一下let命令,let在shell中執行算數運算。命名的參數可以在算術運算式中直接利用名稱訪問,不要前面帶有“$”符號。當訪問具名引數時,就作為算術運算式計算它的值。算術運算式按長整數進行求值,並且不檢查溢出。當然,用0作除數就產生錯誤。let的替代表示形式是:((算數運算式))
5. until語句
文法結構:
until
語句序列A
do
語句序列B
done
until語句和while語句只有在測試條件上是相反的,其他的都一樣。
6. for語句
文法結構
for var in list
do
語句序列A
done
1.如果list中還包含有token,則轉到步驟2,否則結束;2.var被設定為list中的下一個token;3.語句序列A中的命令被執行;4.返回步驟1
注意:這裡var的更新是每次迴圈後都替換為list中的下一個變數,不同於C語言中的迴圈計數
echo file list:for i in *; do echo $idone
7. continue和break語句
如果在迴圈體中使用continue則跳出本次迴圈,進入下一次迴圈;使用break則跳出整個迴圈。
8. shell函數
函數是指令碼內的指令碼,使用函數比起使用一個新的指令碼可以大大加快調用速度。
有兩種函數格式:
(1)function 函數名
{
...
}
(2)函數名()
{
...
}
調用函數就像調用一個shell指令碼或者命令一樣,直接在寫函數名字,如果需要,還可以跟參數。shell尋找命令的順序是:別名,關鍵字,函數,內部命令,指令碼和可執行程式,所以函數可能屏蔽外部指令碼或者程式。
可以給函數傳遞參數,在函數中處理和在普通指令碼中處理參數基本一樣,使用$1等位置參數,或者$*,$#等,但¡在函數中的$0並不表示函數名,而仍然是指令碼的檔案名稱。
start(){ echo “第一個參數:$1” echo “$0: $*”}
調用
start a b c
如果不作特殊說明,在函數內訪問的變數是整個指令碼共用的變數,如果要定義只在函數內有效局部變數,則需要使用local語句。