您现在的位置是:首页 >学无止境 >【linux 脚本篇】流程控制语句-case网站首页学无止境
【linux 脚本篇】流程控制语句-case
目录
?博客主页:大虾好吃吗的博客
?专栏地址:Linux从入门到精通
用来实现程序流程的选择、循环等进行控制,类似于if,但更具准确性,一般用于服务的启动、停止脚本。
语法格式如下:
case 变量 in
变量1)
命令序列1;;
变量2)
命令序列2;;
变量3)
命令序列3;;
esac
这种语句,需要做大量的练习,下面来几个案例,其他的可以在网上搜。为了区分if和case的区别,下面案例使用两种语法实现。
案例一:菜单选项
实现方法分别用if语句和case语句展示,先来看看if语句是怎么实现的吧。
if语句执行
下面使用了多分支if语句,来判断123,但是这种语法不够精确。可以加入更多的正则表达式,来增加精确性,但是这样不太实用,我们的理念是用最少的语法命令,做更多更便捷的事。
[root@daxia ~]# vim if1.sh
#!/bin/bash
cat << EOF
=========+
1.backup |
2.copy |
3.quit |
=========+
EOF
read -p "请输入你的选项[1|2|3]:" as
if [ ${as} -eq 1 ];then
echo "==backup=="
elif [ ${as} -eq 2 ];then
echo "==copy=="
elif [ ${as} -eq 3 ];then
echo "==quit=="
else
echo "已退出;请输入[1|2|3]"
fi
执行脚本测试
[root@daxia ~]# sh if1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:1
==backup==
[root@daxia ~]# sh if1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:2
==copy==
[root@daxia ~]# sh if1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:3
==quit==
[root@daxia ~]# sh if1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:4
已退出;请输入[1|2|3]
case语句执行
#!/bin/bash
cat <<EOF
=========+
1.backup |
2.copy |
3.quit |
=========+
EOF
read -p "请输入你的选项[1|2|3]:" as
case ${as} in
1)
echo "==backup=="
;;
2)
echo "==copy=="
;;
3)
echo "==quit==" && exit
;;
*)
echo "警告!!!!"
echo "执行${0}后,请输入 {1|2|3}"
exit
esac
[root@daxia ~]# vim case1.sh
#!/bin/bash
cat <<EOF
=========+
1.backup |
2.copy |
3.quit |
=========+
EOF
read -p "请输入你的选项[1|2|3]:" as
case ${as} in
1)
echo "==backup=="
;;
2)
echo "==copy=="
;;
3)
echo "==quit==" && exit
;;
*)
echo "!!!!大虾警告!!!!"
echo "执行${0}后,请输入 {1|2|3}"
exit
esac
执行脚本测试
[root@daxia ~]# sh case1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:1
==backup==
[root@daxia ~]# sh case1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:2
==copy==
[root@daxia ~]# sh case1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:3
==quit==
[root@daxia ~]# sh case1.sh
=========+
1.backup |
2.copy |
3.quit |
=========+
请输入你的选项[1|2|3]:4
!!!!大虾警告!!!!
执行case1.sh后,请输入 {1|2|3}
案例二:rsync服务脚本
案例思路: rsync的启动命令: rsync --daemon rsync的停止命令: pkill rsync
if语句执行
[root@daxia ~]# vim if2.sh
#!/bin/bash
source /etc/init.d/functions
if [ $1 == "start" ];then
rsync --daemon
action "rsync starting..." /bin/true
elif [ $1 == "stop" ];then
pkill rsync
action "rsync stoping..." /bin/true
else
echo "USAGE: $0 {start|stop}"
exit
fi
执行脚本测试
[root@daxia ~]# sh if2.sh start
rsync starting... [ 确定 ]
[root@daxia ~]# sh if2.sh stop
rsync stoping... [ 确定 ]
case语句执行
[root@daxia ~]# vim case2.sh
#!/bin/bash
source /etc/init.d/functions
case $1 in
start)
if [ ! -f /var/run/rsync.pid ];then
touch /var/run/rsync.pid
rsync --daemon
action "rsync starting.." /bin/true
else
action "rsync service running..." /bin/false
fi
;;
stop)
rm -f /var/run/rsync.pid
pkill rsync
action "rsync stopping..."/bin/true
;;
status)
if [ ! -f /var/run/rsync.pid ];then
echo "rsync service status InActive.."
else
rsync_status=$(ps aux |grep -v grep | awk '{print $2}')
echo "rsync service status Active("$rsync_status")"
fi
;;
*)
echo "USAGE:$0{start|stop|status}"
exit
esac
执行脚本测试
[root@daxia ~]# sh case2.sh start
rsync starting.. [ 确定 ]
[root@daxia ~]# sh case2.sh status
rsync service status Active(PID 1 2 4 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 30 31 32 33 41 43 44 45 47 60 97 274 275 276 277 283 284 288 289 291 292 297 298 328 370 371 380 381 394 395 396 397 398 399 400 401 402 403 404 483 568 572 574 578 580 582 583 584 656 692 701 715 730 785 1211 1216 1315 1738 1742 1785 1789 2351 2608 20877 21461 21462 21498 21531 21571 21622 21673 21702 35033 49365 49824 49828 49895 50046 50050 50051 50057 50353 50354 50358 50449 50453 78262 78273 78357 78380 78393 78395 78400 78401 78403)
[root@daxia ~]# sh case2.sh stop
rsync stopping.../bin/true [ 确定 ]
案例三:nginx服务脚本
案例思路: 如何启动 /usr/sbin/nginx 如何停止 /usr/sbin/nginx -s stop 如何重载
[root@daxia ~]# vim case3.sh
#!/bin/bash
source /etc/init.d/functions
case $1 in
start)
if [ -f /var/run/nginx.pid ];then
action "nginx服务已启动..." /bin/false
exit
else
/usr/sbin/nginx
action "nginx服务启动成功..." /bin/true
fi
;;
stop)
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s stop
if [ $? -eq 0 ];then
action "nginx服务关闭成功..." /bin/true
else
action "nginx服务关闭失败..." /bin/false
fi
else
action "nginx服务已经关闭..." /bin/false
fi
;;
reload)
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s reload
if [ $? -eq 0 ];then
action "nginx重载成功..." /bin/true
else
action "nginx重载失败..." /bin/false
fi
else
action "nginx没有启动,无法完成重载" /bin/false
fi
;;
status)
if [ -f /var/run/nginx.pid ];then
nginx_pid=$(cat /var/run/nginx.pid)
echo "nginx ( $nginx_pid ) is running..."
else
echo "nginx is not running..."
fi
;;
*)
echo "USAGE: $0 {start|stop|status}"
esac
执行脚本测试
[root@daxia ~]# sh case3.sh start
nginx服务启动成功... [ 确定 ]
[root@daxia ~]# sh case3.sh reload
nginx重载成功... [ 确定 ]
[root@daxia ~]# sh case3.sh status
nginx ( 98699 ) is running...
[root@daxia ~]# sh case3.sh stop
nginx服务关闭成功... [ 确定 ]
案例四:实现系统工具箱
[root@daxia ~]# vim case4.sh
#!/bin/bash
cat <<EOF
+++++++++++++++
h 显示命令帮助+
f 显示分区使用+
d 显示磁盘挂载+
m 查看内存使用+
u 查看cpu负载 +
q 退出 +
+++++++++++++++
EOF
read -p "请输入你的选项:" SZ
case $SZ in
f)
df -hT
;;
d)
mount | more
;;
m)
free -h
;;
u)
uptime
;;
q)
exit
;;
*)
echo "USAGE: $0 【h|f|d|m|u|q】"
esac
案例五:实现简单的jumpserver跳板机
案例思路: 需要看到所有能管理的主机 选择菜单,提示输入某个主机IP地址分为公有和私有地址 私有地址: A 10.0.0.0 -10.255.255.255 B 172.16.0.0 - 172.31.255.255 C 192.168.0.0 - 192.168.255.255
配置前先配置互信和本地解析 通过秘钥访问(无密码)最安全。 在跳板机产生一对秘钥(公钥、私钥)采用方式:公钥加密,私钥解密,将公钥放到对端服务器上。
打开四台虚拟机ip分别是10、11、12、13,下面配置每台都配置互信,本地解析。
(1)生成公钥id_rsa.pub和私钥id_rsa(保存在宿主目录下.ssh)
[root@node1 ~]# ssh-keygen -t rsa
(2)将公钥传给对端服务器
[root@node1 ~]# for i in 10 11 12 13;do ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.8.$i;done
(3)可以将对方ip和主机名进行本地解析
[root@node1 ~]# vim /etc/hosts
192.168.8.10 node1
192.168.8.11 node2
192.168.8.12 node3
192.168.8.13 node4
(4)将/etc/hosts 文件拷贝给所有服务器
[root@node1 ~]# for i in 10 11 12 13;do scp /etc/hosts root@192.168.8.$i:/etc/; done
最后使用case来制作一个脚本吧,注意这里是node1主机,四台都做了互信,都可以执行脚本操作。(里面的function后面再讲)
[root@node1 ~]# vim case5.sh
#!/bin/bash
Menu(){
cat <<EOF
1.node1-192.168.8.10
2.node2-192.168.8.11
3.node3-192.168.8.12
4.node4-192.168.8.13
h.help
EOF
}
Menu
read -p "请输入你要连接的主机序号:" CONN
case $CONN in
1)
ssh root@192.168.8.10
;;
2)
ssh root@192.168.8.11
;;
3)
ssh root@192.168.8.12
;;
4)
ssh root@192.168.8.13
;;
h)
clear
Menu
;;
*)
echo "USAGE: $0 输入要连接的主机序号 【1|2|3|4】"
esac