詳解shell 函式定義與呼叫
一、Shell函式定義格式
shell函式定義格式,各部分說明如下:
[ function ]等中括號括起來部分----表示可選(即可有可無)
your_function_name部分----為函式名
your_shell_commands部分----為函式程式碼;shell一般以行為單位,但可以使用“\”換行,也可以在單行內使用“;”作為分隔符
return int部分----shell函式可以有返回值,但只能返回整數不能返回字串
[ function ] your_function_name()
{
your_shell_commands;
[return int;]
}
二、基本函式定義與呼叫
本節程式實現函式定義與呼叫,注意呼叫函式是不要使用括號(即如testFun()是不對的),程式碼如下:
testFun{
echo "helloworld!"
}
testFun
三、傳遞引數呼叫
3.1 傳遞引數沒有空格
本節程式實現向被呼叫函式傳遞引數,$0是執行該指令碼的shell傳遞的引數從$1開始、傳遞多個引數是以空格分隔,程式碼如下:
1 2 3 4 5 6 |
testFun(){
echo $1
}
param= "helloworld!"
testFun $param
|
執行如下:
除了可以通過$n形式獲取第n個引數外,還可以使用以下幾個寫法:
形式 | 說明 |
---|---|
$# | 傳遞到指令碼的引數個數 |
$* | 以一個單字串顯示所有向指令碼傳遞的引數 |
$$ | 指令碼執行的當前程序ID號 |
$! | 後臺執行的最後一個程序的ID號 |
$@ | 與$*相同,但是使用時加引號,並在引號中返回每個引數。 |
$- | 顯示Shell使用的當前選項,與set命令功能相同。 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
3.2 傳遞引數有空格
本節程式實現向被呼叫函式傳遞有空格的引數,我們將上節“helloworld!”加個空格變為“hello world!”如下:
1 2 3 4 5 6 |
testFun(){
echo $1
}
param= "hello world!"
testFun $param
|
執行如下:
可以看到只有空格前的“hello”被列印了出來,空格後的“world!”並沒被打印出來(實際上空格後的"world!"被識別成了$2)
要傳遞有空格的引數也簡單,在傳遞時加上雙引號即可(單引號就不被認為是變量了所以不能用單引號),程式碼如下:
1 2 3 4 5 6 |
testFun(){
echo $1
}
param= "hello world!"
testFun "$param"
|
執行如下:
四、獲取返回值
4.1 返回整型
1 2 3 4 5 6 7 8 9 10 11 12 |
testFun(){
echo "helloworld!"
return 99
}
# 千萬要注意shell並不像其他語言直接返回返回值,其返回值放到$?中,這也是為什麼只能返回整型的原因
# 所以這種承接方法是錯誤的,獲取到的值是echo列印的內容
# return_value=`testFun`
# 以下才是正確獲取通過return返回的返回值的正確寫法
testFun
echo "the return value is: $?"
|
4.2 返回字串
我們在前面一直說shell函式只能返回整型不能返回字串,我們試一下強行返回字串,程式碼如下:
1 2 3 4 5 6 |
testFun(){
echo "helloworld!"
return "success"
}
testFun
|
執行如下,可以看到執行到return處報錯“-bash: return: success: numeric argument required”
所以要通過return返回字串是沒戲的,我們有兩個變通的方法,第一種是通過$()獲取函式的所有列印,程式碼如下:
1 2 3 4 5 6 7 |
testFun(){
echo "helloworld!"
echo "success"
}
return_value = $(testFun)
echo "$return_value"
|
執行如下:
可以看到成功獲取到了‘success“。但同時也可以看到這種做法獲取到的被呼叫函式的所有輸出,單要返回值到得單獨解析一下
另外的一種做法是直接用一個變數,shell的變數都是全域性的在被呼叫函式中賦值的變數在呼叫函式處也可獲取,程式碼如下:
1 2 3 4 5 6 7 |
testFun(){
echo "helloworld!"
return_value= "success"
}
testFun
echo $return_value
|
執行如下:
學而不思則罔,思而不學則殆