作用
将命令序列按格式写在一起
可方便重复使用命令序列
Shell函数定义 (先定义后调用)
[ function ] 函数名(){
命令序列
[return x] 使用return或exit可以显式地结束函数
调用函数的方法
函数名 [参数1] [参数2]
暂停循环命令
break:退出整个循环
continue:退出本次循环
例如:
for i ....
for j ....
continue 跳出j循环,i循环继续进行
break 跳出整个循环
函数应用
两个数字求和
通过sum () {}定义函数
使用read命令交互输入两个数并求和
[root@server2 ~]# vi sum.sh
[root@server2 ~]# chmod +x sum.sh
[root@server2 ~]# ./sum.sh
#!/bin/bash
# 函数求和
sum(){ 函数体
read -p "输入的第一个数:" num1 变量1
read -p "输入的第二个数:" num2 变量2
echo "你输入的这两个数为 $num1和$num2"
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 命令无效
函数的作用范围
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
函数内部变量通过local来实现
通过定义myfun函数,在其内部设置局部变量i
函数内部和外部分别赋值,进行结果验证
设置有内部变量
[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
都是全局变量
[root@server2 ~]# vi fun_scope.sh
[root@server2 ~]# ./fun_scope.sh
myfun()
{
i=10
echo $i
}
i=9
myfun
echo $i
函数的参数
参数的用法
函数名称 参数1 参数2 参数3 ...
参数的表示方法
$1 $2 $3 ....${10} ${11} ...
1.7.3 通过函数参数将日志信息写入文件
通过定义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."
递归函数
调用自己本身的函数
递归遍历目录
通过定义递归函数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" ] 如果是目录
then echo "$2$f" 输出原样
list_files "$1/$f" " $2" 如果是子目录 输出缩进
else
echo "$2$f" 如果是文件 输出原样
fi
done
}
list_files "/var/log" ""
-d:测试是否为目录
创建一个三层目录文件进行查看
[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