shell编程之函数和case多条件分支语句
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之函数和case多条件分支语句相关的知识,希望对你有一定的参考价值。
shell编程之函数和case多条件分支语句
函数介绍
函数介绍:
shell 中允许将一组命令集合
或语句
形成一段可用代码
,这些代码块称为shell函数
。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能
即将完后一个功能的代码进行命名和封装,后续按需调用
函数的优点:
-
代码模块化,调用方便,节省内存
-
代码模块化,代码量少,排错简单
-
代码模块化,可以改变代码的执行顺讯
函数的调用:
- 直接键入函数名就可以调用
- 可以用
;
分割函数名进行调用
函数语法定义
- 需要有一个主调函数,对其他功能函数进行调用
函数语法格式:
函数格式:
语法一:
#l 函数名 () {
#l 代码块
#l return N
#l }
语法二:
#l function 函数名 {
#l 代码块
#l return N
#l }
#l 函数中return的说明:
1. return可以结束一个函数,类似循环控制语句break
2. return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0~256
3. 如果没有return命令,函数将返回最后一个shell的退出值
调用函数说明:
编写脚本:
# vim function.sh
[root@server ~]# vim function.sh
#!/bin/bash
# Desc:函数的调用方式
# 自定义函数
a () {
cat <<EOF
鲁迅先生警言
———— 周树人
猛兽总是独行,牛羊才成群结队。
EOF
echo
}
function b {
for i in 1;do
echo
echo "这句话确实是我说的"
done
}
# 调用函数
b;a;a
b
运行脚本:
# sh function.sh
[root@server ~]# sh function.sh
这句话确实是我说的
鲁迅先生警言
———— 周树人
猛兽总是独行,牛羊才成群结队。
鲁迅先生警言
———— 周树人
猛兽总是独行,牛羊才成群结队。
这句话确实是我说的
return 返回值的说明:
编写脚本:
设置return,不给定返回状态:
# vim return.sh
[root@server ~]# vim return.sh
#!/bin/bash
# Desc:函数的调用方式
# 自定义函数
a () {
echo "11111"
xxx
return
echo "22222"
}
# 调用函数
a
运行脚本:
返回结果:
# sh return.sh => return 后面一条语句没有打印,结束函数执行
[root@server ~]# sh return.sh
11111
return.sh: line 7: xxx: command not found
查看return状态值:
# echo $?
[root@server ~]# echo $?
127
-------------------------------------------------------------------------------------
设置return,给定返回状态:
# vim return.sh
[root@server ~]# vim return.sh
...
return 123
....
运行脚本:
返回结果:
# sh return.sh
[root@server ~]# sh return.sh
11111
return.sh: line 7: xxx: command not found
查看return状态值:
# echo $?
[root@server ~]# echo $?
123
通过函数编写功能脚本
- 通过函数方式编写一个监控物理内存使用率、系统负载情况、监控网卡流量、磁盘使用率的小脚本,要求按Q才退出
#!/bin/bash
# 物理内存使用率函数
Mem () {
# 分别获取物理内存的使用率和总量
Memory_use=`free|egrep "Mem"|tr -s " "|cut -d " " -f3`
Memory_total=`free|egrep "Mem"|tr -s " "|cut -d " " -f2`
# 使用率为两个数相除
Memory_usage=`echo "scale=2;$Memory_use*100/$Memory_total"|bc`
cat <<EOF
磁盘使用率
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
echo "磁盘使用率:${Memory_usage}%"
}
# 查看系统 1 5 15 分钟的负载情况函数
System_load () {
load=`uptime|tr -d "," |tr -s " "|cut -d " " -f 11-13`
cat <<EOF
系统负载状态
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
echo "当前系统1 5 15分钟负载状态:$load"
}
# 监控网卡流量函数
function nic {
# 监控网卡总出入流量
nic_in_totle1=`ifconfig ens33|egrep "RX packets"|tr -s " "|cut -d " " -f6`
nic_out_totle1=`ifconfig ens33|egrep "TX packets"|tr -s " "|cut -d " " -f6`
sleep 1
nic_in_totle2=`ifconfig ens33|egrep "RX packets"|tr -s " "|cut -d " " -f6`
nic_out_totle2=`ifconfig ens33|egrep "TX packets"|tr -s " "|cut -d " " -f6`
# 网卡每秒流量是下一秒减去上一秒
nic_in_secon=`expr $nic_in_totle2 - $nic_in_totle1`
nic_out_secon=`expr $nic_out_totle2 - $nic_out_totle1`
cat <<EOF
网卡每秒流入流出量
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
echo -e "网卡流入:$nic_in_secon/s\\t\\t网卡流出:$nic_out_secon/s"
}
# 监控磁盘使用率函数
function disk {
# 移除虚拟文件系统,获取磁盘和其使用率
disk_use=`df -mh|egrep -v "tmpfs"|tr -s " "|cut -d " " -f1,5`
cat <<EOF
磁盘使用率
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
echo "$disk_use"
}
function main {
cat <<EOF
系统监控系小脚本
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1)监控系统物理内存使用率
2)监控系统1 5 15 分钟负载状态
3)监控网卡每秒流入流出状态
4)查看系统磁盘使用率
EOF
echo -n "请输需要查看的监控标识 [按Q退出]:"
read ch
if [ "$eq" = "Q" ];then
exit
fi
while [ "$ch" != "Q" ]
do
if [ $ch -eq 1 ];then
clear
Mem
sleep 3
main
elif [ $ch -eq 2 ];then
clear
System_load
sleep 3
main
elif [ $ch -eq 3 ];then
clear
nic
sleep 3
main
elif [ $ch -eq 4 ];then
clear
disk
sleep 3
main
else
clear
echo "请输入1-4或和按Q退出"
sleep 3
main
fi
done
}
# 调用主调函数
main
case语句
case条件分支语句介绍
在生产环境中,总会遇到一个问题需要根据不同的状况来执行不同的预案。那么要处理这样的问题就要先根据可能出现的情况来写相应的预案,根据出现的情况加载不同的源。
case
语句: 条件分支语句,根据用户给予的条件和自己预设的条件去匹配,匹配成功则执行对应条件下的代码
应用场景: 主调函数中多条件匹配
注意:
case
不能做条件的比较运算case
在实际应用中如果没有*)
这个条件也可以选择不写
case 条件分支语句语法格式:
# case $变量名 in => 取变量内容,和预设的条件匹配
#l 条件1) => 条件可以是多个,用 | 分割条件
#l 代码块 => 满足条件执行此代码块
#l ;; => 该代码块执行结束
#l 条件2) => 上一个条件不满足执行下一个条件判断,满足则执行...
#l 代码块
#l ;;
#l ...
#l *) => 如果条件都不匹配则执行代码块x
#l 代码块x
#l ;;
#l esac => 结束case多条件分支语句
编写一个简单的case语句:
- 根据用户输入的性别条件条件返回内容
#!/ein/bash
read -p "请输入你的性别:" gender
case $gender in
男|man|x|X|male)
echo "先生您好,欢迎来到德莱联盟"
;;
女|women|y|Y|remale)
echo "女士您好,欢迎来到购物广场"
;;
*)
echo "请输入性别选项"
echo "选项为:男或者女、male或remale"
;;
esac
用case语句编写一个相亲小脚本:
要求:
将用户输入的姓名、性别、年龄、婚姻状况、房车状况,通过条件输出,用case再嵌套case的用法
#!/bin/bash
read -p "姓名:" name
read -p "性别:" gender
case $gender in
男|male)
read -p "请输入你的年龄:" boy_age
if ((boy_age>=18));then
read -p "您结婚了吗?" boy_marry
case $boy_marry in
没结|没|no)
read -p "你有房有车吗?" house_car
case $house_car in
有|yes)
echo "$name 先生,恭喜你,您条件符合,今晚8:00请到富贵酒店3号桌,那里将有一位女性与你共享晚餐!"
;;
没有|no)
echo "$name 先生对不起,您不符合条件"
;;
*)
echo "请正确输入有无房车。选项为有或没有"
;;
esac
;;
结了|yes)
echo "结婚了还来相亲,告你老婆去!"
;;
*)
echo "请输入结没结婚,选项为yes和no"
;;
esac
elif ((boy_age<18));then
echo "$name 小毛孩,你不满你十八岁,恕不招待"
fi
;;
女|remale)
echo "$name 女士您好,我们这里只招待男性"
;;
*)
echo "请输入您的姓名和性别,性别选项可选男或女"
;;
esac
以上是关于shell编程之函数和case多条件分支语句的主要内容,如果未能解决你的问题,请参考以下文章