函數可以讓我們將一個複雜功能劃分成若干模塊,讓程序結構更加清晰,代碼重複利用率更高。像其他編程語言一樣,Shell 也支持函數。Shell 函數必須先定義後使用。
Shell 函數的定義格式如下:
function_name () { list of commands [ return value ] }
如果你願意,也可以在函數名前加上關鍵字 function:
function function_name () { list of commands [ return value ] }
函數返回值,可以顯式增加return語句;如果不加,會將最後一條命令運行結果作爲返回值。
Shell 函數返回值只能是整數,一般用來表示函數執行成功與否,0表示成功,其他值表示失敗。如果 return 其他數據,比如一個字符串,往往會得到錯誤提示:“numeric argument required”。
如果一定要讓函數返回字符串,那麼可以先定義一個變量,用來接收函數的計算結果,腳本在需要的時候訪問這個變量來獲得函數返回值。
先來看一個例子:
#!/bin/bash
# 定義無返回值函數
Hello () {
echo "Hello caoliu!"
}
# 調用函數只需要給出函數名,不需要加括號。
Hello
funWithReturn(){
return $(($1+$2))
}
funWithReturn 3 4
#函數返回值在調用該函數後通過 $? 來獲得。
ret=$?
echo "結果: $ret !"
運行結果:
Hello caoliu!
結果: 7 !
像刪除變量一樣,刪除函數也可以使用 unset 命令,不過要加上 .f 選項,如下所示:
$unset .f function_name
如果你希望直接從終端調用函數,可以將函數定義在主目錄下的 .profile 文件,這樣每次登錄後,在命令提示符後面輸入函數名字就可以立即調用。
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...
帶參數的函數示例:
#!/bin/bash funWithParam(){ echo " $1 " echo " $2 " echo " $10 " echo " ${10} " echo " ${11} " echo " $# " # 參數個數 echo " $* " # 傳遞給函數的所有參數 } funWithParam 1 2 3 4 5 6 7 8 9 34 73
運行腳本:
1 2 10 34 73 12 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。
另外,還有幾個特殊變量用來處理參數,前面已經提到: