1.函數定義
Shell函數有3中定義方式:第一種定義:
function func(){
do something...
}
第二種定義,函數名與“{”之間必須有空格。
function func {
do something...
}
第三種定義:
func(){
do something...
}
Shell函數有點兒類似於C語言的函數,由於Shell函數沒有函數聲明,所以函數定義必須放在函數使用之前。同時,函數名必須是唯一的,否則會有問題,如果你重新定義了函數,那麼新定義的函數會覆蓋原函數,而不會產生錯誤信息。代碼如下:
#!/usr/bin/env bash
function func1(){
name=func1
echo "This is function $name"
}
func1
# 函數名與“{”之間必須有空格
function func2 {
name=func2
echo "This is function $name"
}
func2
func3(){
name=func3
echo "This is function $name"
}
func3
輸出:
This is function func1
This is function func2
This is function func3
2.返回值
2.1默認退出狀態碼
默認情況下,函數的退出狀態碼是函數中最後一條命令返回的退出狀態碼。在函數執行結束後,你可以用標準的“$?”變量來讀取退出狀態碼。這種默認情況有個弊端,就是退出狀態碼只能顯示函數中最後一條命令的執行狀態,而無法保證函數中其他命令的執行狀態。下面的例子中,改變函數中命令的順序,得到不同的退出狀態碼:
function func(){
ls -l test
echo "test return status code"
}
func
echo "return status code: $?"
function func(){
echo "test return status code"
ls -l test
}
func
echo "return status code: $?"
2.2使用return命令指定退出狀態碼
在Shell腳本中,return命令不是返回函數的值,而是返回退出狀態碼。在使用return返回退出狀態碼時,需要注意:- 函數一結束就取退出狀態碼。如果在函數執行結束後,執行了其他命令,那麼退出狀態碼可能會丟失。
- 退出狀態碼必須在0~255之間。
function func(){
read -p "Enter a value: " value
return $[ $value * 2 ]
}
func
echo "return status code: $?"
2.3函數返回值
如果要得到函數字符串、浮點數、整型等類型的返回值,那麼首先需要用echo命令輸出,然後將輸出保存到變量裏。獲取返回值有兩種方式:一是,將函數看作命令,用反引號“`”括起函數名;二是,用“$(函數名)”的形式。function func(){
name=func1
echo "This is function $name"
}
val1=`func`
echo "The return value: $val1"
val2=$(func)
echo "The return value: $val2"
3.在函數使用變量
3.1向函數傳遞參數
函數可以使用標準的參數環境變量來代表命令行上傳給函數的參數。例如,函數名在$0中定義,函數命令行上的任何參數在$1、$2等定義,特殊變量$#代表傳給函數的參數數目。但是,函數的$#、$0、$1、$2等這些變量,和腳本主體參數的$#、$0、$1、$2等這些變量是完全不同的。注意,在腳本中給函數傳參時,函數名和參數必須在同一行。function func(){
arg1=$1
val=4
echo $[ $out * $arg1 * $2 ]
}
out=3
val1=`func $out 5`
echo "The return value: $val1"
val2=$(func $out 5)
echo "The return value: $val2"
3.2在函數中使用變量
在瞭解函數中使用變量之前,我們需要先知道全局變量和局部變量。- 全局變量:在Shell腳本的任何地方都有效的變量。默認情況下,在腳本中定義的任何變量都是全局變量。
- 局部變量:函數內部使用的任何變量都可以被聲明爲局部變量。聲明局部變量時,在變量名前加上“local”關鍵字就行了;也可以在給變量賦值時,在變量名前加上“local”。
function func(){
local arg
arg=$1
local temp=$[ $arg * 2 ]
echo $temp
}
temp=3
val=`func 5`
echo "The global temp: $temp"
echo "The return value: $val"
4.數組變量和函數
4.1向函數傳遞數組參數
向腳本函數傳遞數組變量時,有些複雜。如果將數組變量當做單個參數傳遞的話,函數只會取數組變量的第一個值。要解決這個問題,你必須將該數組變量的值分解成單個值,然後將這些值作爲函數參數使用。在函數內部,你可以將所有的參數重組到新的數組變量中。function func(){
#local newarr=$1 只會得到數組的第一個元素
local newarr=(`echo $@`)
for i in ${!myarr[*]};do
newarr[i]=$[ ${newarr[i]} * 2 ]
done
echo "The new array: ${newarr[*]}"
}
myarr=(1 2 3 4 5)
echo "My array: ${myarr[*]}"
func ${myarr[*]}
輸出:
My array: 1 2 3 4 5
The new array: 2 4 6 8 10
4.2從函數返回數組
從函數裏向Shell腳本傳回數組變量,也用類似接收數組參數的方法。函數用echo語句來按正確順序輸出單個數組值,然後腳本再將它們重新放進一個新的數組變量中。function func(){
local newarr=(`echo $@`)
for i in ${!myarr[*]};do
newarr[i]=$[ ${newarr[i]} * 2 ]
done
echo ${newarr[*]}
}
myarr=(1 2 3 4 5)
echo "My array: ${myarr[*]}"
val=(`func ${myarr[*]}`)
echo "The return array: ${val[*]}"
echo "The 5th element in the return array: ${val[4]}"
輸出:
My array: 1 2 3 4 5
The return array: 2 4 6 8 10
The 5th element in the return array: 10