shell脚本之——函数
一、函数概念及格式
1、函数的概念
函数定义:封装的可重复利用的具有特定功能的代码
函数就是可以在shell脚本当中做出一个类似自定义执行的命令的东西,最大的功能就是简化我们很多的代码。
- 将命令序列按照格式书写在一起
- 可方便重复使用命令序列
2、函数的格式
2.1 格式一
[function] 函数名 (){ 命令序列 [return x] #使用return或者exit可以显式的结束函数 }
2.2 格式二
函数名(){ 命令序列 }
二、函数调用的方法
1、格式
函数名 [参数1] [参数2]
2、实例操作
写一个脚本里面包括函数备份yum线上源,创建yum本地源和清理缓存安装httpd服务
2.1 格式
#!/bin/bash #创建本地yum源仓库,并安装httpd服务 backup () { cd /etc/yum.repos.d mkdir repo.bak mv *.repo repo.bak mount /dev/cdrom /mnt &> /dev/null } function configuration { echo -e '[loacal]\nname=local\nbaseurl=file:///mnt\nenable=1\ngpgcheck=0' > /etc/yum.repos.d/local.repo } setup () { yum clean all yum makecache yum install -y httpd &> /dev/null } #############main############### backup configuration setup
2.2 实例操作
二、函数的返回值
1、return的概念
return 语句的作用是终止一个函数的执行,结束当前代码块中return后的语句,即return后的语句不再执行,从当前函数退出,为该函数返回一个指定的expression 值。如果 expression 被省略, 或在函数内没有 return 语句被执行,则把值 undefined 赋给调用当前函数的表达式。
即当函数执行return后,函数体将被赋值为函数的返回值(即return指定的返回值,可以是任何数据类型甚至是一种方法)
2、return的作用
返回函数结果
语法为:return+表达式
语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果。return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值, 由return后面的参数指定。return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!当执行return语句时,即使函数主体中还有其他语句,函数执行也会停止!
返回函数控制
语法为:return;
通常情况下return后面跟有表达式,但是并不是绝对的。此情况就是单纯的将控制权转交给主调函数继续执行。
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
- 退出状态码必须是0~255,超出时值将为除以256取余
3、实例操作一:return返回值
3.1 格式
#!/bin/bash function test1 { read -p "请输入一个值:" value return $[$value * 2] } test1 #调用函数 echo $?
3.2 运行结果
4、实例操作二:在实例一的基础上,如何将大于256的值正常输出
4.1 格式
#!/bin/bash function test1 { read -p "请输入一个值:" value #return $[$value * 2] echo $[$value * 2] } #test1 #调用函数 result=$(test1) echo $result
4.2 输出结果
三.函数传参
函数也是有参数的,它的内置变量与shell脚本很类似,函数名称代表示$0,而后续的变量也是以$1、$2…来替换的
1、实例操作一
1.1、格式
#!/bin/bash sum() { echo "第一个位置参数为$1" echo "第二个位置参数为$2" sum1=$[$1 + $2] echo $sum1 } read -p "请输入第一个参数:" first read -p "请输入第二个参数:" second sum $first $second
2.1、输出结果
2、实例操作二
2.1 格式
#!/bin/bash #Function and the cords sum(){ sum1=$[$1 + $2] echo "$1 $2的和为:$sum1" } sum $1 $2
2.2 输出结果
四、函数变量的作用范围
1、概念
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
2、实例操作一
2.1 格式
#!/bin/bash func () { #local i=10 i=8 echo $i } func echo $i
2.2 输出结果
3、实例操作二
3.1 格式
#!/bin/bash func () { local i=10 echo $i } func echo $i
3.2 输出结果
五、函数的递归
函数调用自己本身的函数
1、函数的递归应用:阶乘
阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 – 1826)于1808年发明的运算符号。
阶乘,也是数学里的一种术语。
阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。
在表达阶乘时,就使用“!”来表示。如h阶乘,就表示为h!
阶乘一般很难计算,因为积都很大。
1.1 格式
#!/bin/bash fact () { if [ $1 -eq 1 ];then echo 1 else local temp=$[$1 - 1] local result=$(fact $temp) echo $[$1 * $result] fi } read -p "请输入一个阶乘的数字:" n result=$(fact $n) #该值跟local result 不同 echo "$n的阶乘结果是 $result"
1.2 实例操作
2、函数的递归应用:递归目录
案例:
mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,
输出环境变量PATH所包含的所有目录以****************22及其中的子目录和所有不可执行文件
2.1 格式
#!/bin/bash list_files() { for i in $(ls $1) do if [ -d "$1/$i" ];then echo "$2$i" list_files "$1/$i" " $2" else if [ ! -x "$1/$i" ];then echo "$2$i" fi fi done } ###############main############## OLDIFS=$IFS IFS=$IFS':' for folder in $PATH do echo $folder list_files "$folder" " " done IFS=$OLDIFS
2.2 实例操作
2.3 格式
#!/bin/bash #Output all directories contained in the environment variable PATH along with subdirectories and any non-executable files output () { for n in $(ls $1) do if [ -d "$1/$n" ];then echo "----目录$2$n" output "$1/$n" "---子目录$2" else if [ ! -x "$1/$n" ];then echo "---不可执行文件$n" fi fi done } #########main############ OLDIFS=$IFS IFS=$IFS':' for i in $PATH do echo $i output $i done IFS=$OLDIFS
2.4 输出结果
六、创建函数库
1、创建数据库格式
#!/bin/bash #Create a database fact () { if [ $1 -eq 1 ];then echo 1 else local temp=$[$1 - 1] local result=$(fact $temp) echo $[$1 * $result] fi } addition () { echo $[$1 + $2] } subtraction () { echo $[$1 - $2] } multiplication () { echo $[$1 * $2] } division () { if [ $2 -ne 0 ];then echo $[$1 / $2] else echo "被除数不能为0" fi }
2、调用数据库脚本格式
. /root/demoq9.sh value1=$1 value2=$2 result1=$(addition $value1 $value2) result2=$(subtraction $value1 $value2) result3=$(multiplication $value1 $value2) result4=$(division $value1 $value2) result5=$(fact $value1) echo "加法的结果为 $result1" echo "减法的结果为 $result2" echo "乘法的结果为 $result3" echo "除法的结果为 $result4" echo "$value1的阶乘结果为 $result5" ~
3、输出结果