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
,用于引入文件,之后文件中的函数就可以直接调用了