shell编程之函数
一、函数的作用
- 将命令序列按格式写在一起,可方便重复使用命令序列,避免代码重复
- 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
二、函数的格式
格式1 function 函数名 { 命令序列 } 函数名 #调用函数
格式2 函数名 () { //函数名和小括号之间的空格可有可无 命令序列 } 函数名 #调用函数
三、函数返回值
return:表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
- 作用于函数内部,脚本使用return退出函数时只退出函数,不影响脚本后续内容执行
- 返回值可自定义,范围是0~255,超出时值将除以255取余。
- 业内约定成俗的是,0表示成功,非0表示失败
- exit:表示终止函数运行,脚本中使用exit退出函数时直接退出整个脚本,脚本后续内容不再执行,并把指定的退出状态码返回给调用者
四、函数传参
在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递
- 示例:
[root@localhost opt]# vim hanshu2.sh sum () { total=$(($1+$2)) echo $total } sum $1 $2
五、函数变量的范围
- 函数变量在shell脚本中仅在当前shell环境中使用
- shell脚本中的变量默认全局有效
- 如果需要将变量限定在函数内部使用,需要在定义的变量前加上loca命令
- 示例1
[root@localhost opt]# vim hanshu4.sh abc () { a=5 b=6 } a=9 b=8 abc echo $a echo $b
[root@localhost opt]# vim hanshu4.sh abc () { local a=5 #加了local表示只在函数内部生效,在函数外面重新定义,值会改变 b=6 } a=9 b=8 abc echo $a echo $b
示例2
[root@localhost opt]# vim hanshu3.sh abc () { echo "inside $i" let i++ local i i=8 echo "inside $i" } i=9 #定义i=9 abc #调用函数abc echo "outside $i" #输出i的值
六、函数的递归(调用函数本身)
6.1 阶乘
[root@localhost opt]# vim jiecheng.sh jiecheng () { #$1表示调用函数时,后面跟的位置参数。如果值是1,就输出1。 if [ $1 -eq 1 ] then echo 1 else #定义一个本地变量number,变量值为每次传入的参数值减1 local number=$(($1-1)) #不停地调用函数自身,直到number的值等于1 local result=$(jiecheng $number) #自己乘自己的结果减1 echo "$(($1*$result))" fi } read -p "输入一个数,求阶乘:" num result=`jiecheng $num` echo $result
6.2 递归目录
[root@localhost opt]# vim jiecheng2.sh mulu () { for i in `ls $1` do if [ -d "$1/$i" ] then echo "$2$i" mulu "$1/$i" "$2" else echo "$2$i" fi done } mulu $1
七、函数库
我们可以事先创建一个函数库文件,在里面定义各种常用的函数,然后可以在别的shell脚本中直接引用这个函数库文件,使得不需要再次定义函数即可直接调用函数。
[root@localhost opt]# vim shujuku.sh jiafa() { result=$(($1 + $2)) echo $result } jianfa() { result=$(($1 - $2)) echo $result } chengfa() { result=$(($1 * $2)) echo $result } chufa(){ if [ $2 -ne 0 ] then result=$(($1/$2)) echo $result else echo "分母不能为0" fi }
[root@localhost opt]# vim diaoyong.sh . /opt/shujuku.sh #引用函数库文件 read -p "第一个数:" first read -p "第二个数:" second a=`jiafa $first $second` b=`jianfa $first $second` c=`chengfa $first $second` d=`chufa $first $second` echo $a echo $b echo $c echo $d