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