1)
建立
function
name{
...
}
或:
name(){
…
}
2)
調用
直接使用函數名,函數定義後才可以調用;
函數同名時新定義將覆蓋老的定義,並且無警示;
3)
退出
使用
return
4)
傳回值
函數退出狀態,可使用變數
$?
獲得——
$?
總是最後一條命令的結果,因此函數返回後需儘快擷取傳回值,否則會被新的命令的返回覆蓋;
l
預設傳回值為最後一條命令的傳回值;
l
使用“
return n
”返回,
n
為整數,範圍
0
~
255
;
TBD
,只能使用
$?
獲得結果?
l
使用
shell
變數儲存傳回值,可用於任意傳回值類型——使用
echo
輸出
eg:
function
a {
echo "xxxx"
read -t 3 -p "input sth" sth
#
輸出到
STDOUT
的
input sth
不會作為返回的一部分
echo 1000
echo $sth
}
rlt=`a`
#a
的傳回值儲存在
rlt
echo
$rlt
#rlt
的值為所有
echo
輸出的組合
如果採取例子裡的方式,則函數被作為一個子進程,其中的
exit
不能用於退出指令碼;此外,仍然可以使用
$?
獲得函數
return
(或
exit
)的結果;
TBD
:怎樣讓其中的部分
echo
不作為函數輸出?
方法:可以把這個
echo
重新導向到
STDERR
;
5)
傳參
bash
將函數作為小型指令碼處理,也可傳遞參數,函數名為
$0
,參數為
$1
、
$2
等
傳參的調用方式
result=`a 1 abc`
6)
全域變數
指令碼中定義的變數預設都是全域變數,函數可訪問其外部定義的變數——不好的風格
eg:
function
a {
c=dddd
#
函數中定義的變數
echo $c
}
c=1111
echo
$c
a
#c
值被更改
echo
$c
7)
局部變數,使用
local
eg:
function
a {
local c=dddd
#
定義局部變數
echo $c
}
c=1111
echo
$c
a
echo
$c
#c
值不被函數
a
更改
8)
遞迴
eg
,實現階乘
x!=x*(x-1)!
function
x {
if [ $1 -eq 1 ]; then
echo $1
else
local tmp=$[$1-1]
echo $[$1 * `x $tmp`]
fi
}
ret=`x
5`
echo $ret
9)
函數庫
建立:將函數寫到獨立檔案中即可,如
aaa.t
庫的問題:函數與環境變數一樣,僅在建立它的
shell
中有效;
使用:
source
命令,實現在當前
shell
中執行命令的功能;
source
的別名:
dot operator
不使用
source
命令則將建立新的
shell
執行命令,從而面臨上述問題;
eg
,引用
aaa
庫:
.
./aaa.t
source
命令相當於
#include
,用於引入檔案,之後檔案中的函數就可以直接調用了