shell脚本case_模式匹配详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在某种意义上,case语句是if语句的简洁版,case语句适合做字符串模式匹配,如果不同的字符值对应不同的功能则用case语句实现,case无法做比较以及测试命令,最后一个模式可以省略;;command -v 命令用来测试是否是一个命令看$?返回值即可1.1根据系统版本匹配yum源文件

case 模式匹配

一、case语法结构

case 变量名 in
模式1)
​ 命令序列1
​ ;;
模式2)
​ 命令序列2
​ ;;
模式3)
​ 命令序列3
​ ;;
*)
​ 无匹配后命令序列
esac

在某种意义上,case语句是if语句的简洁版,case语句适合做字符串模式匹配,如果不同的字符值对应不同的功能则用case语句实现,case无法做比较以及测试命令,最后一个模式可以省略;;

command -v 命令用来测试是否是一个命令看$?返回值即可

1.1根据系统版本匹配yum源文件

#!/bin/bash
yum_server=192.168.81.250
os_version=$(cat /etc/redhat-release |awk '{print $(NF-1)}'| awk -F '.' '{print $1"."$2}')
[ -d /etc/yum.repos.d/bak ] || mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/* /etc/yum.repos.d/bak &>/dev/null
case "$os_version" in
"7.6")
        cat > /etc/yum.repos.d/centos7u6.repo <<-EOF
        [centos7u6]
        name=centos7u6
        baseurl=file:///media
        enabled=1
        gpgcheck=0      
        EOF
        echo "$os_version yum config finish...."
        ;;
"6.5")
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
        echo "$os_version yum config finish...."
        ;;
"5.4")
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
        echo "$os_version yum config finish...."
        ;;
*)
        echo "error os_version"
esac
echo "finish.."

1.2删除用户,根据输入的字符确认是否删除

#!/bin/bash
-------------------if实现-----------------
read -p "please input a delete username: " user
id $user &>/dev/null
if [ $? -ne 0 ];then
        echo "no such user: $user"
        exit 1        //设置退出状态码
fi
read -p "are you sure delete: $user [y/n]" action
if [ "$action" = y -o "$action" = "yes" -o "$action" = "Y" -o "$action" = "YES" ];then
        userdel -r $user &>/dev/null
        echo "$uer is del..."
else
        echo "you is quit"
fi
-------------------------case实现-----------------
read -p "please input a delete username: " user
id $user &>/dev/null
if [ $? -ne 0 ];then
        echo "no such user: $user"
        exit 1
fi
read -p "are you sure delete: $user [y/n]" action
case $action in
y|Y|yes|YES)
        userdel -r $user &>/dev/null
        echo "$user is del..."
        ;;
*)
        echo "you is quit"
esac

1.3测试某个文件是否是一个命令

#!/bin/bash
command1=/bin/date
if  command -v $command1 &>/dev/null;then
        :   
else
        echo " $command is not keywords"
fi

1.4利用case+if实现批量创建用户

#!/bin/bash
read -p "please input prefix: " prefix
if [ -z $prefix ];then
        echo "error prefix"
        exit 1
fi
read -p "please input create num: " num
if [[ ! $num =~ ^[0-9]+$ ]];then
        echo "error num"
        exit 2
fi
read -p "are you sure create {prefix+num} user[y/n]: " action
case $action in
y|Y|yes|YES)
        echo "begin create....."
        for i in `seq $num`
        do
                user=$prefix$i
                useradd $user &>/dev/null
                if [ $? -eq 0 ];then
                        echo "123" | passwd --stdin $user &>/dev/null
                fi
                echo "$user is add....."
        done
        ;;
n|N|no|NO)
        echo "scripts is quit...."
esac

1.4利用case+if实现批量删除用户

#!/bin/bash
read -p "please input prefix: " prefix
if [ -z $prefix ];then
        echo "error prefix"
        exit 1
fi
read -p "please input delete num: " num
if [[ ! $num =~ ^[0-9]+$ ]];then
        echo "error num"
        exit 2
fi
read -p "are you sure delete {prefix+num} user[y/n]: " action
case $action in
y|Y|yes|YES)
        echo "begin delete....."
        for i in `seq $num`
        do
                user=$prefix$i
                userdel -r $user &>/dev/null
                echo "$user is del....."
        done
        ;;
n|N|no|NO)
        echo "scripts is quit...."
esac

1.5case实现编译安装软件

#!/bin/bash
###############################################################################################
#                           #
# case编译安装工具箱  jxl--20200225                  #
#                                                                                             #
###############################################################################################
tools_dir=/software 
apache_tools_dir=/software/httpd-2.2.17.tar.gz
mysql_tools_dir=/software/mysql-5.5.22.tar.gz
cmake_tools_dir=/software/cmake-2.8.6.tar.gz
nginx_tools_dir=/software/nginx-1.6.0.tar.gz
echo -e "\033[33m begin checking software...\033[0m"
yum list installed | grep 'gcc-c++' &>/dev/null
if [ $? -ne 0 ];then
  read -p "system not gcc,do you install gcc-c++? [y|n]: " action
  case $action in 
  y|Y) 
    yum -y install gcc-c++
    if [ $? -eq 0 ];then
      echo -e "\033[32m gcc-c++ is installed... \033[0m"
    fi
    ;;
  n|N)
    echo -e "\033[31m no gcc-c++ not install tools... \033[0m"
    echo -e "\033[31m scripts is quit... \033[0m"
    exit 1
    ;;
  esac  
fi
echo -e "\033[31m Can install the tool:[httpd|mysql|nginx] \033[0m"
read -p "please input install tool: " tool
case $tool in 
httpd)
  read -p "are you sure install apache_httpd [y|n]: " action_httpd
  if  [ "$action_httpd" = "y" -o "$action_httpd" = "yes" ];then
    yum -y remove httpd
    tar xvf $apache_tools_dir  -C $tools_dir
    cd $tools_dir/httpd-2.2.17
    ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make && make install
    ln -s /usr/local/httpd/bin* /usr/local/bin &>/dev/null
    cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
    sed -i -e '1a # chkconfig:35 85 21' /etc/init.d/httpd
    sed -i -e '2a # description:Startup script for the Apache HTTP Server' /etc/init.d/httpd
    systemctl start httpd 
    systemctl enable httpd
    netstat -lnpt | grep httpd
    if [ $? -eq 0 ];then
      echo -e "\033[32m httpd installed....\033[0m"
    fi
  elif [ "$action_httpd" = "n" -o "$action_httpd" = "no" ];then
    echo -e "\033[31m scripts is quit... \033[0m"
    exit 1
  else
    echo -e "\033[31m error action \033[0m" 
    exit 2
  fi
  curl -I 127.0.0.1 &>/dev/null
  if [ $? -eq 0 ];then
    echo -e "\033[32m web page is ok...\033[0m"
  fi
  ;;
mysql)
  read -p "are you sure install mysql [y|n]: " action_mysql
  if  [ "$action_mysql" = "y" -o "$action_mysql" = "yes" ];then
    yum -y remove mariadb
    yum -y install ncurses-devel
    tar xvf $cmake_tools_dir -C $tools_dir
    cd $tools_dir/cmake-2.8.6
    ./configure && make && make install
    tar -xvf $mysql_tools_dir -C $tools_dir
    cd $tools_dir/mysql-5.5.22
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWICH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make &&make install
    \cp -rf support-files/my-medium.cnf /etc/my.cnf
    \cp -rf support-files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld
    ln -s /usr/local/mysql/bin/* /usr/local/bin &>/dev/null
    groupadd mysql &>/dev/null
    useradd -M -s /sbin/nologin -g mysql mysql &>/dev/null
    chown -R mysql:mysql /usr/local/mysql
    /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql
    /etc/init.d/mysqld start
    netstat -lnpt | grep mysql
    if [ $? -eq 0 ];then
      echo -e "\033[32m mysqld installed...\033[0m"
    fi
  elif [ "$action_mysql" = "n" -o "$action_mysql" = "no" ];then
    echo -e "\033[31m scripts is quit... \033[0m"
    exit 1
  else
    echo -e "\033[31m error action... \033[0m"  
    exit 2
  fi
  ;;
nginx)
  read -p "are you sure install mysql [y|n]: " action_nginx
  if  [ "$action_nginx" = "y" -o "$action_nginx" = "yes" ];then
    yum -y install  openssl-devel zlib-devel pcre-devel 
    tar -xvf $nginx_tools_dir -C $tools_dir
    cd $tools_dir/nginx-1.6.0
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module  && make && make install
    netstat -lnpt | grep 80
    if [ $? -eq 0 ];then
      echo -e "\033[32m port 80 is used...\033[0m"
      echo -e "\033[33m begin update port is 8888!\033[0m"
      sed -i 's/80;/8888;/' /usr/local/nginx/conf/nginx.conf
      if [ $? -eq 0 ];then
        echo -e "\033[33m  port is 8888...\033[0m"
      fi
    fi
    ln -s /usr/local/nginx/sbin/* /usr/local/sbin &>/dev/null
    nginx 
    netstat -lnpt | grep nginx 
    if [ $? -eq 0 ];then
      echo  -e "\033[32m nginx installed...\033[0m"
    fi
   elif [ "$action_nginx" = "n" -o "$action_nginx" = "no" ];then
    echo -e "\033[31m scripts is quit... \033[0m"
    exit 1
     else
        echo -e "\033[31m error action... \033[0m"      
        exit 2
  fi
  ;;
*)
  echo -e "\033[31m The tool is still in development...\033[0m"
esac

1.6case实现简单的跳板机

跳板机适用场景:


1.业务服务器不允许直接连接,通过跳板机进行连接


2.业务服务器不允许root用户登录


跳板机原理


由客户端登录到跳板机服务器,跳板机服务器根据用户输入的ip远程连接对应的应用服务器,客户端不能直接与应用服务器直连,所有主机准备远程连接时使用的账号密码,并设置为密码验证或者密钥验证


此案例需求:


1.做出一个服务器列表


2.根据用户的输入判断去连接哪一台服务器


3.用户连到跳板机服务器就已经将脚本运行好


4.连接进去后不允许退出

#!/bin/bash
clear
trap "" INT HUP OUIT TSTP
while :
do
        cat <<-EOF
                +---------------------------------------------------------+
                |                       jumpserver                        |
                |                       1.192.168.81.210                  |
                |                       2.192.168.81.211                  |
                |                       3.192.168.81.212                  |
                |                       4.192.168.81.213                  |
                +---------------------------------------------------------+
        EOF
        echo -en "\e[33m please input connection host: \e[0m"
        read host
        case  $host in
        1)
                ssh jxl@192.168.81.210
                ;;
        2)
                ssh jxl@192.168.81.211
                ;;
        3)
                ssh jxl@192.168.81.212
                ;;
        4)
                ssh jxl@192.168.81.213
                ;;
        "")
                ;;
        *)
                echo "The host does not exist"
         esac
done

1.7case实现系统管理工具箱

#!/bin/bash
menu(){
cat <<-EOF
+------------------------------------------------------------+
|               系统工具箱                                   |
|               h.help                                       |
|               b.磁盘分区情况                               |
|               d.磁盘使用情况                               |
|               m.内存使用情况                               |
|               u.系统负载情况                               |
|               t.CPU使用情况                                |
|               q.exit                                       |
+------------------------------------------------------------+
EOF
}
clear
while :
do
        menu
        echo  -en "\e[33m Please choose to use tool: \e[0m"
        read  tools
        case $tools in
        h)
                echo "这是一个系统管理工具箱,可以根据所需选择对应的工具"
                menu
                ;;
        b)
                lsblk
                ;;
        d)
                df -hT
                ;;
        m)
                free -g
                ;;
        u)
                uptime
                ;;
        t)       
            top
            ;;
        q)
                exit
                ;;
        "")
                ;;
        *)
                echo -e "\e[31m error option \e[0m"
        esac
done
目录
相关文章
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
77 1
|
21天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
45 2
6种方法打造出色的Shell脚本
|
8天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
29 1
|
12天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
34 2
|
26天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
45 6
|
23天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Shell Docker 容器
使用exec模式与shell模式,执行ENTRYPOINT和CMD的区别
结合 `exec`与 `shell`模式,`ENTRYPOINT`与 `CMD`在Docker容器启动时的交互方式展现出不同的特点。选择哪种模式,取决于对执行环境的纯净度、性能需求以及是否需要利用shell特性。理解这些细微差别,有助于更精细地控制容器的行为,优化应用部署与管理流程。
87 0
|
1月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
27 0
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
67 12
|
1月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
55 2