06.Shell函数应用
徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208
0.Shell中函数的作用
1.命令合集,完成特定功能的代码块
2.在shell中定义函数可以使用代码模块化, 便于复用代码,加强可读性
3.函数和变量类似, 先定义才可调用,如果定义不调用则不会被执行传参 $1,$2
变量 local
返回值 return $?
1.Shell如何定义函数
# 方式一
函数名() {
command
}
# 方式二
function 函数名 {
command
}
2.Shell如何调用函数
调用函数非常简单, 只需要在脚本中写入函数的名称即可
// 在脚本中直接写入函数名即可完成函数调用
function_name
//函数传参
fun $1 传入脚本后第一个参数
fun $* 接收所有参数的传递
3.Shell中定义函数与调用示例1
//1.定义一个函数
fun01(){
num=10
for i in $(seq $num)
do
total=$[$i + $num]
done
echo "计算结果是: $total"
}
//2.调用函数
fun01
//3.执行Shell脚本结果
[root@Shell ~]# sh fun.sh
计算结果是: 20
####修改后1版
//1.定义一个函数
fun01(){
for i in $(seq $num)
do
total=$[$i + $num]
done
echo "计算结果是: $total"
}
//2.给num传递值
num=10
//3.调用函数
fun01
//4.执行Shell脚本结果
[root@Shell ~]# sh fun.sh
计算结果是: 20
####修改后2版
//1.定义一个函数
fun01(){
//2.num接收$1的传参
num=$1
for i in $(seq $num)
do
total=$[$i + $num]
done
echo "计算结果是: $total"
}
//3.将脚本的位置参数传递给函数
fun01 $1
//4.执行Shell脚本结果
[root@Shell ~]# sh fun.sh 10
计算结果是: 20
####修改后3版
//1.定义一个函数
fun01(){
//2.num接收$1的传参
num=$1
for i in $(seq $num)
do
total=$[$i + $num]
done
echo "计算结果是: $total"
}
//3.将脚本的位置参数传递给函数
fun01 $1
fun01 $2
fun01 $3
//4.执行Shell脚本结果
[root@Shell ~]# sh fun.sh 5 10 20
计算结果是: 10
计算结果是: 20
计算结果是: 40
4.Shell中函数的位置参数传递
# 脚本执行有自己的位置参数, 函数也有自己的位置参数, 可以将两者发生互动。
#1.定义函数,接收三个位置参数
fun3() {
echo "$(($1 * $2 * $3))"
}
#result=`fun3 2 3 4`
#2.将位置参数传递给函数
result=`fun3 $1 $2 $3`
echo "result is: $result"
######修改版
#1.定义函数,接收三个位置参数
fun3() {
echo "$(($num1 * $num2 * $num3))"
}
num1=$1
num2=$2
num3=$3
result=`fun3 $num1 $num2 $num3`
echo "result is: $result"
###函数传参使用场景
source /etc/init.d/functions
Test() {
if [ $? -eq 0 ];then
action "Nginx $1 is ok" /bin/true
else
action "Nginx $1 is error" /bin/false
fi
}
case $1 in
start)
nginx
Test $1
;;
stop)
nginx -s stop
Test $1
;;
reload)
nginx -s reload
Test $1
;;
*)
echo "USAGE: $0 { start|stop|reload }"
esac
5.Shell的函数返回值,也算是退出的状态
# echo 返回函数返回值
# return 返回指定函数退出状态码
fun2() {
echo 100
return 1
}
result=`fun2`
echo "函数的状态码是: $?"
echo "函数的返回值是: $result"
###例子
[root@ansible-node30 nginx]# cat fun1.sh
file=/etc/ttt # 定义文件
t_file(){ # 函数判断
if [ -f $file ];then
return 0
else
return 1
fi
}
# 调用函数
t_file
#根据函数返回状态码进行输出
if [ $? -eq 0 ];then
echo "该文件存在 $file"
else
echo "该文件不存在 $file"
fi
##例子:
1.如果用户输入的数值大于0且小于10则返回0
2.如果用户输入的数值大于等于10且小于20则返回1
3.如果用户输入的数值大于等于20且小于30则返回2
4.输入其余数值则返回3
checknum(){
read -p "请输入对应的数字:" num
if [ $num -ge 0 -a $num -lt 10 ];then
return 0
elif [ $num -ge 10 -a $num -lt 20 ];then
return 1
elif [ $num -ge 20 -a $num -lt 30 ];then
return 2
else
return 3
fi
}
# 调用函数
checknum
# 保存当时$?的返回值
Rtv=$?
#根据返回值进行判断
if [ $Rtv -eq 0 ];then
echo "你输入的数字大于0小于10"
elif [ $Rtv -eq 1 ];then
echo "你输入的数字大于10小于20"
elif [ $Rtv -eq 2 ];then
echo "你输入的数字大于20小于30"
fi
6.Shell中函数相关使用场景和案例
1.所有脚本必须有选择菜单
2.所有的危险操作均需给出提示
1.编写系统初始化脚本
配置 YUM
安装 Nginx
q 键退出程序
2.编写虚拟机管理脚本
安装虚拟机
关闭虚拟机
打开虚拟机
克隆虚拟机(可以指定克隆的数量)
q键退出程序
3.编写系统管理工具箱
查看内存的使用情况
查看磁盘的使用情况
查看系统的负载
q 键退出程序