为什么用它?
case 语句:多个值,匹配不同的模式,如果匹配成功,执行相对应的命令。
是什么?
语法结构:比如,结账系统,选择烤鸭(模式1),算的是烤鸭的价格(先告诉您,command1告诉您烤鸭一只,command2询问您确定吗?);选择龙虾,算的是烤鸭的价格,直到清单列完,则结束(esac),计算总价。
case 值 in
模式1)
command1
command2
;;
模式2)
command1
command2
;;
*)
command1
command2
;;
esac
实例一:用select配合case编写点菜脚本!
1、编写好玩的点菜脚本:
#!/bin/bash
sum=0
PS3="请点菜(1-6): "
select MENU in 烤鸭 海参 龙虾 烤全羊 火锅 点菜结束;do
case $REPLY in
1)
echo $MENU 价格是 100元
let sum+=100
;;
2) echo $MENU 价格是 88元
let sum+=88
;;
3) echo $MENU 价格是 66元
let sum+=66
;;
4) echo $MENU 价格是 166元
let sum+=166
;;
5) echo $MENU 价格是 200元
let sum+=200
;;
6) echo "点菜结束,退出"
break
;;
*) echo "点菜错误,重选"
;;
esac
done
echo "总价是:$sum元"
验证:
2、 运维脚本:
编写运维脚本,比如:关闭防火墙,ping主机连通等放到一个脚本,方便使用。
#!/bin/bash
sum=0
PS3="请选择(1-3): "
select MENU in 关防火墙 ping主机 改ip 结束;do
case $REPLY in
1) systemctl stop firewalld
setenforce 0
echo $MENU 成功
let sum+=1
;;
2) LIST=`cat ipadds.txt`
for IP in $LIST
do
ping -c3 -i0.2 -W3 $IP &> /dev/null
if [ $? -eq 0 ]
then
echo "host $IP is up!"
else
echo "host $IP is down!"
fi
done
echo $MENU 成功
let sum+=1
;;
3) ENS33=/etc/sysconfig/network-scripts/ifcfg-ens33
DIR=/backup/`date +%Y-%m-%d`
if
[ ! -d $DIR ];then
mkdir -p $DIR
fi
cp $ENS33 $DIR
if
[ $? -eq 0 ];then
sed -i 's/dhcp/static/' $ENS33
sed -i '/^ONBOOT/c\ONBOOT=yes' $ENS33
read -p "ip: " IP
echo "IPADDR=$IP" >> /etc/sysconfig/network-scripts/ifcfg-ens33
ifdown ens33 &> /dev/null
ifup ens33 &> /dev/null
fi
echo $MENU成功
let sum+=1
;;
4) echo "结束,退出"
break
;;
*) echo "错误,重选"
;;
esac
done
echo "执行:$sum项"
验证:
1、编辑需要ping的主机
执行脚本:
扩展:我们可以给里面多加功能,比如:改ip、配置yum源等等!
2、改ip
实例二:
实现输入对应的代码,显示相关信息,B与b等同,只有输入Q与q才退出,实现下图效果。
#!/bin/bash
echo "A.主机IP"
echo "B.磁盘剩余空间"
echo "C.系统运行时间"
echo "Q.退出"
#read -p "请输入你要查询的数据:" DATA
IP=`ifconfig ens33 | grep "netmask" | awk '{print $2}'`
D=`df -Th | grep "/$" | awk '{print $5}'`
R=`uptime | awk '{print $3"分钟"}'`
while true
do
read -p "请输入你要查询的数据:" DATA
if [ $DATA = q ] || [ $DATA = Q ]
then
exit 1
fi
case $DATA in
a|A)
echo "主机IP是:$IP"
;;
b|B)
echo "磁盘剩余空间:$D"
;;
c|C)
echo "系统运行时间:$R"
;;
q|Q)
echo "退出"
;;
*)
echo "错误,重选"
;;
esac
done
实例三:
编写shell巡检信息,效果如下图:
#!/bin/bash
DATE=$(date +%F\ %T)
UPTIME=$(uptime | awk '{print $3'})
CPU=$(top -b -n 1 | grep "Cpu" | awk '{print $8}')
MEM=$(expr $(free | grep "Mem" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
H=$(hostname)
I=$(ifconfig |awk 'NR==2{print $2}')
D=$(df -hT | grep "/$" | awk '{print $6}')
Y=$(df -hT | grep "/$" | awk '{print $5}')
echo "主机名称:$H"
echo "主机IP:$I"
echo "当前时间:$DATE"
echo "运行时间:$UPTIME小时"
echo "CPU使用率:$CPU%"
echo "内存占用率:$MEM%"
echo "磁盘使用率:$D"
echo "磁盘剩余空间:$Y"
注意:MEM变量值还有另一种方法,MEM=$(free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($3)/$2*100}')
截图: