Shell脚本之函数
自动化运维脚本之Shell的函数使用
前言
1. shell函数
1.1 什么是函数
函数定义:封装的可重复利用的具有特定功能的代码
函数就是可以在shell脚本当中做出一个类似自定义执行的命令的东西,最大的功能就是简化我们很多的代码。
将命令序列按照格式书写在一起
可方便重复使用命令序列
1.2 函数的格式
格式一:
[function] 函数名 (){
命令序列
[return x] #使用return或者exit可以显式的结束函数
}
格式二:
函数名(){
命令序列
}
1.3 函数的调用
函数名 [参数1] [参数2]
实例:写一个脚本里面包括函数备份yum线上源,创建yum本地源和清理缓存安装httpd服务。
[root@192 home]# vim yum.sh
#!/bin/bash
prepare(){
cd /etc/yum.repos.d
mkdir repo.bak
mv *.repo repo.bak
mount /dev/sr0 /mnt > /dev/null
}
configuration(){
echo '
[local]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0' > local.repo
}
end(){
yum clean all
yum makecache
yum install -y httpd > /dev/null
}
#############main###############
prepare
configuration
end
~
1.4 函数的返回值
- return表示退出函数并返回一个退出值,脚本中可以用
$?
变量显示该值
使用原则:
- 1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
- 2、退出状态码必须是0~255,超出时值将为除以256取余。
#!/bin/bash
read -p "输入一个数字:" num
#将输出的数字乘以2
test(){
return $[$num*2]
}
#调用函数后,要立即获取返回值
test
echo $?
结果:返回值结果超过256,会进行余256计算,然后取结果
实例:将函数返回值赋予变量,然后使用该变量进行计算
![](/qrcode.jpg)
#!/binbash
#将输入的数字乘以2计算
test(){
read -p "请输入一个数字:" num
echo $[$num*2]
}
#将函数的结果赋予变量,然后使用该变量进行计算
result=$(test)
echo $[$result+50]
结果:
1.5 函数的传参
函数也是有参数的,它的内置变量与shell脚本很类似,函数名称代表示$0,而后续的变量也是以$1、$2…来替换的,这里比较容易搞混,因为函数是一个方法,我们看代码的时候直接从代码的主体部分去看,然后代码中调用了什么函数我们再去看这个函数是做什么的就不容易搞混了。
举例:
#!/bin/bash
#函数test内有两个参数,分别为$1和$2,然后求出这两个数的和
test(){
echo "第一个位置参数为:$1"
echo "第二个位置参数为:$2"
sum=$[$1+$2]
echo "$sum"
}
#获取用户输入的数字,调用函数并将用户输入的数字作为函数的参数传输
read -p "请输入第一个参数" num1
read -p "请输入第二个参数" num2
test $num1 $num2
1.直接看代码主体部分,num1和num2分别为用户输入的两个变量的值,这里输入的是10和20;
2.然后发现调用了函数test,并传入了两个参数,第一个数为num1,也就是10,第二个数是num2,也就是20;
3.然后在函数体内,定义了变量sum等于两个参数的和,也就是10和20,10+20=30.
结果:
1.6 函数变量的作用范围
在Shell脚本中函数的执行并不会开启一个新的子Shell,而是仅在当前定义的Shell环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local
来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
- shell脚本中变量默认全局有效
- local命令:将变量限定在函数内部使用
实例:
#函数内部使用local声明一个变量i后赋值8
test(){
local i=8
echo "函数内部变量"$i
}
#函数外部也声明一个变量i,赋值10
i=10
test
echo "shell中的全局变量"$1
结果:
1.7 函数的递归
函数调用自己本身的函数
实例:阶乘
1.8 递归目录
dir_recu(){
do
if [ -d $1 ];then
echo "$2$1"
dir_recu "$i" "$2"
else
if [ -x $1 ];then
echo "$2$1"
fi
fi
done
}
#########main##########
OLDIFS=$IFS
IFS=$IFS:
for j in `echo $PATH`
do
dir_recu $j ""
done
IFS=$OLDIFS
目录和文件会以这个形式显示出来
1.8 创建函数库
shell 函数库也是一个 shell 脚本,不过你可以在一个函数库中仅存储其它 shell 脚本中需要调用的函数。
创建函数库脚本文件:myfuncs.sh,在里面写入加法、减法等运算的函数
调用函数库内的函数,函数库的脚本文件要使用绝对路径