流程控制语句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