流程控制语句case
case语法
case 变量 可以是直接传参 赋值 read读入 case 变量 in 模式1) 命令序列 ;; 模式2) 命令序列 ;; 模式3) 命令序列 ;; *) 无匹配后命令序列 esac
案例:
#!/bin/sh cat<<EOF 1.NFS 2.MySQL 3.Redis 4.DOCKER 5.KVM 6.退出脚本 EOF while true do read -p "请输入你想要安装的服务编号或者服务名称: " num case $num in 1) echo "yum -y instll NFS........" ;; 2) echo "yum -y install MySQL......" ;; 3) echo "yum -y install Redis......." ;; 6) exit ;; *) echo "USAGE: $0 read -p [NFS|MySQL|Redis|DOCKER|KVM]" esac done
批量创建用户:
#!/bin/sh read -p "请输入用户的前缀名称: " prefix [ -z $prefix ] && echo "请输入用户的前缀" && exit read -p "请输入要创建多少个:" num if [[ ! $num =~ ^[0-9]+$ ]];then echo "请输入整数" exit fi for i in `seq $num` do echo ${prefix}$i done read -p "你确定要创建以上用户吗?[y|yes|Y|YES|n|N|NO]: " re for a in `seq $num` do case $re in y|Y|YES|yes) useradd ${prefix}$a &>/dev/null if [ $? -eq 0 ];then echo "${prefix}$a 创建成功" else echo "useradd: user ${prefix}$a already exists" fi ;; n|N|no|NO) exit ;; *) echo "USAGE: $0 请输入[y|n]" esac done
批量删除用户:
#!/bin/sh read -p "请输入用户前缀名称: " prefix read -p "请输入用户个数: " num for i in `seq $num` do echo $prefix$num done read -p "你确定要删除以上用户吗?[y|Y|n|N]: " re for a in `seq $num` do case $re in y|Y) userdel -r $prefix$a &>/dev/null if [ $? -eq 0 ];then echo "$prefix$a 删除成功" else echo "$prefix$a 删除失败" fi ;; n|N) echo "玩啥" exit ;; *) echo "USAGE $0 [y|Y|n|N]" esac done
案例:
使用case语句写一个可查看系统资源的脚本
#!/bin/sh menu(){ cat<<EOF 1. 查看内存 2. 查看磁盘 3. 查看负载 4. 查看登陆信息 5. 查看菜单 6. 退出 EOF } menu while true do read -p "请输入查看系统信息的编号:[1-5(6:查看菜单)]: " num case $num in 1) clear free -h ;; 2) clear df -h ;; 3) clear uptime ;; 4) clear w ;; 5) clear menu ;; 6) exit ;; *) echo "USAGE $0 请按照规则来办事" esac done
Nginx服务启停
/usr/sbin/nginx # 启动
/usr/sbin/nginx -s stop # 停止
/usr/sbin/nginx -s reload # 重新加载
/usr/sbin/nginx -s stop && /usr/sbin/nginx # 先停止 后启动--> 重启
通过三剑客过滤Nginx状态 PID 端口 输出到屏幕 # 查看Nginx状态
#!/bin/sh if [ $# -eq 1 ];then pl=$1 TEST(){ if [ $? -eq 0 ];then action "Nginx $pl Is" /bin/true else action "Nginx $pl Is" /bin/false fi } START(){ if [ `ps axu|grep nginx|grep master|wc -l` -gt 0 ];then echo "Nginx is running....." exit else nginx -t &>/dev/null if [ $? -eq 0 ];then /usr/sbin/nginx else echo "请检查Nginx配置文件" exit fi fi } STOP(){ /usr/sbin/nginx -s stop } RELOAD(){ /usr/sbin/nginx -s reload } RESTART(){ /usr/sbin/nginx -s stop sleep 1 /usr/sbin/nginx } STATUS(){ if [ `ps axu|grep nginx|grep master|wc -l` -eq 0 ];then echo "Nginx服务目前是停止状态无法查看" exit else if [ `curl -sI http://127.0.0.1|awk 'NR==1{print $2}'` -eq 200 ];then action "Nginx is running....." /bin/true else action "Nginx is error......" /bin/false fi fi } USAGE(){ echo "USAGE $0 [start|stop|reload|restart|status]" } [ -f /etc/init.d/functions ] && . /etc/init.d/functions case $1 in start) START TEST ;; stop) STOP TEST ;; reload) RELOAD TEST ;; restart) RESTART TEST ;; status) STATUS ;; *) USAGE esac else echo "输入一个就行" exit fi
JUMPSERVER跳板机
1.职责 运维 开发测试 权限
2.菜单 可以连接的服务器有哪些
3.免秘钥登陆
4.开发把脚本ctrl+c掉 直接ssh登陆数据库删除 跑路 禁止ctrl+c z 不能让脚本退出
5.运维口令
简单版)
#!/bin/sh WEB01=10.0.0.7 WEB02=10.0.0.8 NFS=10.0.0.31 menu(){ cat<<EOF 1.WEB01 2.WEB02 3.NFS 4.菜单 EOF } menu trap "echo 不要瞎操作,小心炸掉你" HUP INT TSTP while true do read -p "请输入你要连接的服务器编号或者是主机名:[WEB01|1|WEB0|2] " num case $num in 1) ssh root@$WEB01 ;; 2) ssh root@$WEB02 ;; 3) ssh root@$NFS ;; 4) clear menu ;; woshiyunwei) echo "客官慢走.....下次在来" exit ;; *) read -p "请输入你要连接的服务器编号或者是主机名:[WEB01|1|WEB0|2] " esac done
完善版)
#!/bin/sh JD_menu(){ cat<<EOF 1.我是运维 2.我是开发 3.啥也不是 EOF } OP_menu(){ cat<<EOF 1. WEB01 2. WEB02 3. MySQL 4. NFS 5. Redis 6. ZABBIX 7. ELK 8. Git 9. Jenkins EOF } DEV_menu(){ cat<<EOF 1.WEB01 2.WEB02 3.Git EOF } JD_menu while true do read -p "请输入你的职责: " jd trap "" INT TSTP HUP while true do case $jd in 1) if [ $jd -eq 1 ];then read -p "请输入运维的暗号: " pass if [ "$pass" = "woshiyunwei" ];then OP_menu read -p "请输入你要连接的服务器编号: " num case $num in 1) ssh root@10.0.0.7 ;; 2) ssh root@10.0.0.8 ;; *) echo "输入服务器编号" esac else read -p "不要假冒运维,请重新输入你的职责" break fi fi ;; 2) DEV_menu read -p "请输入你要连接的服务器编号: " num case $num in 1) ssh root@10.0.0.7 ;; 2) ssh root@10.0.0.8 ;; *) echo "输入服务器编号" esac ;; 3) read -p "请输入你的职责: " jd ;; woxiangtuichu) exit ;; *) read -p "必须输入身份" break esac done done