文章目录
- 一、函数的定义
- 1.1 shell函数:
- 1.2函数如何定义
- 二、函数的返回值
- 三、函数的传参
- 四、函数变量的作用范围
- 五、函数的递归
- 六、函数库
一、函数的定义
1.1 shell函数:
- 使用函数可以避免代码重复
- 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
1.2函数如何定义
法一:
[function] 函数名 (){
命令序列
[return x]
}
法二:
函数名(){
命令序列
}
二、函数的返回值
1、在函数内用return退出函数并返回函数的值,在函数外用echo $?获取返回值,注:返回值的范围只能在0~255,超过部分需除以256取余
编写一个脚本查看他的返回数
执行脚本
可以看出$?的返回值是有上限的,返回值的范围只能在0~255,超过部分需除以256取余
2、在函数内用echo输出值,在函数体外可用变量=$(函数名)获取函数的返回值
编写一个脚本
执行脚本
可以看出相较于$?没有取值的范围。
三、函数的传参
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
示例:
结果:
示例:
结果:
函数体内部的$1 $2代表的是调用函数时,函数后面跟的位置参数
函数体外的$1 $2代表的是执行脚本时,脚本后面跟的位置参数
在函数体内部的$#
代表调用函数时,函数后面跟的参数个数
在函数体内部的$@ $*
代表调用函数时,函数后面跟的所有参数
在函数体外时,$#
代表脚本后面跟的参数个数
在函数体外时,$@ $*
代表脚本后面跟的所有参数
四、函数变量的作用范围
1、函数在Shell脚本中仅在当前脚本Shell环境中有效(使用source/. 执行脚本,也会影响系统的当前Shell环境)
2、Shell脚本中变量默认全局有效
3、将变量限定在函数内部使用local命令
4、系统Shell环境>>脚本Shell环境>>函数Shell环境
示例一:
[root@localhost ~]# vim test5.sh
#!/bin/bash
myfun () {
echo $name
name=fengchu
echo $name
}
name=wolong
myfun
echo $name
[root@localhost ~]# sh test5.sh
wolong
fengchu
fengchu
实例二:
[root@localhost ~]# vim test5.sh
#!/bin/bash
myfun () {
echo $name
local name=fengchu
echo $name
}
name=wolong
myfun
echo $name
[root@localhost ~]# sh test5.sh
wolong
fengchu
wolong
五、函数的递归
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。所以递归要有两个基本要素,结束条件与递推关系。
递归的两个基本要素:
1.边界条件:确定递归到何时结束,也被称为递归的出口
2.递归所使用的模式:大问题分解成小问题。递归函数只有具有上述两个条件,才能计算出结果。
示例一:求阶乘
#!/bin/bash
fact() {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1-1]
local res=$(fact $temp)
echo $[$1 * $res]
fi
}
read -p "请输入一个数:" n
res=$(fact $n)
echo $res
[root@localhost opt]# sh digui.sh
请输入一个数:5
120
[root@localhost opt]# sh digui.sh
请输入一个数:6
720
示例二:使用递归查询目录
使用函数递归目录/var/log,如果是文件直接输出文件名,如果是目录则输出目录名且输出此目录下的所有目录和文件名
[root@localhost opt]# vim digui2.sh
#!/bin/bash
list () {
for f in $(ls $1)
do
if [ -d "$1/$f" ]
then
echo "$2这是目录$f"
list "$1/$f" " $2"
else
echo "$2这是文件$f"
fi
done
}
list "/opt" " "
[root@localhost opt]# sh digui2.sh
这是目录aa
这是目录bb
这是目录cc
这是目录dd
这是文件123.txt
这是文件digui2.sh
这是文件digui.sh
这是目录rh
这是文件test2.sh
这是文件test3.sh
这是文件test4.sh
这是文件test.sh
六、函数库
如果我们能拥有,或者编写过很多有价值的函数(能够具体实现某一功能的那种函数),我们在想运用的时候希望能够跨文件调用,这些在Linux中shell脚本也能实现,只要进行函数库文件的搭建,后期就能在编写脚本时进行直接调用
-
函数库所存文件为普通文件即可,但是函数的格式一定要规范,有能传参的设置。
-
后面进行调用时可以通过 “.”和“source”来进行跨文件调用
创建一个函数库
[root@localhost opt]# vim ku.sh
#!/bin/bash
jiafa(){
echo $[$1 + $2]
}
jianfa(){
echo $[$1 - $2]
}
chengfa(){
echo $[$1 * $2]
}
chufa(){
if [ $2 -eq 0 ]
then
echo "除数不可为0"
else
echo $[$1 / $2]
fi
}
fact(){
if [ $1 -eq 1 ];
then
echo 1
elif [ $1 -gt 1 ]
then
local tmp=$[$1 - 1]
local res=$(fact $tmp)
echo $[$1 * res]
else
echo "输入的值无效,请输入大于等于1的整数!"
fi
}
在其他的shell脚本中执行函数
[root@localhost opt]# vim test6.sh
#!/bin/bash
. /opt/ku.sh
read -p "请输入一个正整数:" num1
read -p "请输入二个正整数:" num2
res1=$(jiafa $num1 $num2)
res2=$(jianfa $num1 $num2)
res3=$(chengfa $num1 $num2)
res4=$(chufa $num1 $num2)
res5=$(fact $num1 $num2)
echo "加法的结果为:$res1"
echo "减法的结果为:$res2"
echo "乘法的结果为:$res3"
echo "除法的结果为:$res4"
echo "阶乘的结果为:$res5"
[root@localhost opt]# sh test6.sh
请输入一个正整数:5
请输入二个正整数:2
加法的结果为:7
减法的结果为:3
乘法的结果为:10
除法的结果为:2
阶乘的结果为:120