文章目录
一、Shell函数的概述
1. 函数的定义
就是将命令序列按格式写在一起,可方便重复使用命令序列
注:Shell函数是需要定义然后在调用
2.函数的作用
在编写Shell脚本的时候,经常会发现多个地方使用同一段代码,如果只是一小段代码,一般也无关紧要,但是要在脚本中多次重写大块代码的话就太累了,Shell中的函数就可以解决这个问题,可以将代码放进函数体封装起来,在需要的地方直接调用它就可以了,它可以提高脚本的可读性和重用性
3.函数的格式
[ function ] 函数名(){
命令序列
[return x] ##使用return或exit可以显式地结束函数
}
return:可以返回状态码或者数据(echo输出)
exit: 只返回状态码
函数的名称必须是唯一的,如重名了,相当于你重新定义了函数,会覆盖之前函数的内容
4.调用函数的方法
函数名 [参数1] [参数2]
5.暂停循环命令
break:退出整个循环
continue:退出本次循环
示例:
for i ......
for j ......
continue 跳出j循环,i循环继续进行
break 跳出整个循环
函数应用示例:
解析:
两个数字求和
通过sum(){}定义函数
使用read命令交互输入两个数并求和
函数写好了要调用它才起作用!
#!/bin/bash
# 函数求和
sum(){ 函数体
read -p "输入的第一个数:" num1 变量1
read -p "输入的第二个数:" num2 变量2
sum=$(($num1+$num2))
echo "这两个数的和为:$sum"
}
sum 调用函数
编写登录系统后便可使用的用户自定义函数(函数嵌套)
解析:
编辑用户自定义函数文件/root/function
在当前Shell中加载可执行的函数文件/root/function
在~/.bashrc文件中添加source /root/function命令
[root@server2 ~]# vim function
[root@server2 ~]# chmod +x function 当前shell可以在当前的bash中可执行
[root@server2 ~]# echo 'source /root/function' >> ~/.bashrc 当前用户在登录时可执行该shell命令
函数脚本
servicectl_usage(){ 语法
echo "Usage:service <service-name> <start|stop|restart|reload|status>"
return 1 返回值 服务名称 动作
}
chk_centos_ver(){ 重镜像
grep "CentOS.*release 7." /etc/centos-release &> /dev/null && echo "7"
grep "CentOS.*release 6." /etc/centos-release &> /dev/null && echo "6"
grep "CentOS.*release 5." /etc/centos-release &> /dev/null && echo "5"
} 此文件中包括该参数 混合输出在屏幕上不显示
servicectl(){
[[ -z $1 || -z $2 ]] && servicectl_usage
[ $(chk_centos_ver)=="7" ] && systemctl $2 $1 || service $1 $2
}
.* :表示任意一个字符,可以重复前面字符0次或多次
-z:表示字符串内容为空
注:CentOS 6 重启服务使用命令:service network restart,
systemctl restart network 命令无效
6.函数的作用范围
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
7.函数内部变量通过local来实现
通过定义myfun函数,在其内部设置局部变量i
函数内部和外部分别赋值,进行结果验证
示例:
1.设置内部变量
[root@server2 ~]# vi fun_scope.sh
[root@server2 ~]# chmod +x fun_scope.sh
[root@server2 ~]# ./fun_scope.sh
myfun()
{
local i 内部
i=8
echo $i
}
i=9
myfun
echo $i
2.设置全局变量
[root@server2 ~]# vi fun_scope.sh
[root@server2 ~]# ./fun_scope.sh
myfun()
{
i=10
echo $i
}
i=9
myfun
echo $i
8.函数的参数
1.参数的用法
函数名称 参数1 参数2 参数3 ......
2.参数的表示方法
$1 $2 $3 .......${10} ${11} ......
示例:
通过函数参数将日志信息写入文件
通过定义appendfile函数实现
[root@server2 ~]# vi write_log.sh
[root@server2 ~]# chmod +x write_log.sh
[root@server2 ~]# ./write_log.sh
[root@server2 ~]# cat /data/my.log
#!/bin/bash
# 文件内容写入
mydir=/data
outfile=${mydir}/my.log
[ -e "${mydir}" ] || mkdir -p ${mydir}
appendfile (){
echo "$2" >> "$1" 先引用后追加
}
appendfile ${outfile} "first line content."
appendfile ${outfile} "second line content."
二、递归函数
1.递归作用
调用自已本身的函数
2. 递归遍历目录
通过定义递归函数list_files来实现
[root@server2 ~]# vi fun_recursion.sh
[root@server2 ~]# chmod +x fun_recursion.sh
[root@server2 ~]# ./fun_recursion.sh
list_files()
{
for f in `ls $1`
do
if [ -d "$1/$f" ] 如果是目录 -d:测试是否为目录
then echo "$2$f" 输出原样
list_files "$1/$f" " $2" 如果是子目录 输出缩进
else
echo "$2$f" 如果是文件 输出原样
fi
done
}
list_files "/var/log" ""
创建一个三层目录文件进行查看
[root@server2 ~]# cd /var/log
[root@server2 log]# mkdir -p a/b/c
[root@server2 log]# cd a/b/c
[root@server2 c]# vi 1.txt
[root@server2 c]# cd
[root@server2 ~]# cd /var/log
[root@server2 log]# ls -lh
[root@server2 log]# cd
[root@server2 ~]# ./fun_recursion.sh