十、Shell之case语句

一、case语句说明

case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整,常被应用于实现系统服务启动脚本。

在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较,如果获取的变量值和某个值(例如值1)相匹配,就会执行值(例如值1)后面对应的指令(例如指令1,其可能是一组指令),直到执行到双分号(;;)才停止,然后再跳出case语句主体,执行case语句(即esac字符)后面的其他命令。

如果没有找到匹配变量的任何值,则执行“*)”后面的指令(通常是给使用者的使用提示),直到遇到双分号(;;)(此处的双分号可以省略)或esac结束,这部分相当于if多分支语句中最后的else语句部分。另外,case语句中表达式对应值的部分,还可以使用管道等更多功能来匹配。

二、case语句的格式

case "变量" in
   值1)
     命令集1
     ;;
   值2)
     命令集2
     ;;
   值3)
     命令集3
     ;;
   ......
   *)
     命令集n
esca

三、case的逻辑结构图

 

四、实验案例

1、如果用户输入的是1~9的任意数字

#! /bin/bash
#脚本后不跟参数
if [ $# -ne 0 ];then
  echo "Usage bash $0"
  exit 1
fi
#输入是一个1-9之间的正整数,并打印相应的数字
read -p "Please input number:" NUM
case $NUM in
 1)
  echo "This number is 1"
  ;;
 2)
  echo "This number is 2"
  ;;
 [3-9])
  echo "This number is $NUM"
  ;;
 *)
  echo "Please input 1-9 init"
 esac

脚本测试

[root@node1 scripts]# bash case1.sh 1
Usage bash case1.sh
[root@node1 scripts]# bash case1.sh 
Please input number:1
This number is 1
[root@node1 scripts]# bash case1.sh 
Please input number:2
This number is 2
[root@node1 scripts]# bash case1.sh 
Please input number:10
Please input 1-9 init
[root@node1 scripts]# bash case1.sh 
Please input number:asdfas
Please input 1-9 init

2、打印菜单

#! /bin/bash
#脚本后不跟参数
if [ $# -ne 0 ];then
  echo "Usage bash $0"
  exit 1
fi
#打印菜单
cat <<EOF
1、BeiJing
2、HaiNan
3、SiChuang
EOF

read -p "Please chose your number:" NUM
case $NUM in
1)
 echo "Welcome to BeiJing"
 ;;
2)
 echo "Welcome to HaiNan"
 ;;
3)
 echo "Welcome to SiChuang"
 ;;
*)
 echo "Please chose your number 1-3 "
 esac

脚本测试

[root@node1 scripts]# bash case2.sh 
1、BeiJing
2、HaiNan
3、SiChuang
Please chose your number:1
Welcome to BeiJing
[root@node1 scripts]# bash case2.sh 
1、BeiJing
2、HaiNan
3、SiChuang
Please chose your number:2
Welcome to HaiNan
[root@node1 scripts]# bash case2.sh 
1、BeiJing
2、HaiNan
3、SiChuang
Please chose your number:3
Welcome to SiChuang
[root@node1 scripts]# bash case2.sh 6
Usage bash case2.sh
[root@node1 scripts]# bash case2.sh 
1、BeiJing
2、HaiNan
3、SiChuang
Please chose your number:fgdfdg
Please chose your number 1-3 

3、结合case语句给输出的字符串加颜色

#!/bin/bash
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK='\E[1;35m'
RES='\E[0m'
#<==以上部分将颜色字符定义为变量,方便后续使用。
if [ $# -ne 2 ];then       #<==如果脚本传入的参数个数不等于2,则打印帮助提示,退出脚本。
    echo "Usage $0 content {red|yellow|blue|green|pink}"
    exit
fi
case "$2" in       #<==$2为脚本传入的第二个参数,即颜色字符串。
    red|RED)       #<==使用竖线|可以匹配大写和小写等字符,也就是可以用竖线来匹配多个值。
        echo -e  "${RED_COLOR}$1${RES}"              #<==给$1(第一个参数)加颜色。
        ;;
    yellow|YELLOW)
        echo -e  "${YELLOW_COLOR}$1${RES}"
        ;;
        green|GREEN)
        echo -e  "${GREEN_COLOR}$1${RES}"
        ;;
    blue|BLUE)
        echo -e  "${BLUE_COLOR}$1${RES}"
        ;;
    pink|PINK)
        echo -e  "${PINK_COLOR}$1${RES}"
        ;;
    *)
        echo "Usage $0 content {red|yellow|blue|green|pink}"
        exit
esac

4、实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户

#! /bin/bash
#加载函数库文件
. /etc/init.d/functions

#只能使用root用户执行
if [ $(echo $UID) -ne 0 ];then
   echo "Please use root exec!"
   exit 1
fi

#/etc/openvpn_authfile.conf不存在,则创建
FILENAME="/etc/openvpn_authfile.conf"
[ ! -f "$FILENAME" ]||touch $FILENAME
#脚本执行时的格式
if [ $# -ne 2 ];then
   echo "Usage $0 [-add|-del|-search] username!!!"
   exit 1
fi

case $1 in         #<==获取命令行第一个参数的值。
   -a|-add)
      shift 1      #<==使用左移位,$2来替代$1
      if [ $(grep "$1" $FILENAME|wc -l) -eq 0 ];then
         echo "$1" >> $FILENAME
         action "$1 add success!!!" /bin/true
      else
         action "$1 is exist or $1 add false!!!" /bin/false
      fi
      ;;
   -d|-del)
      shift 1
       if [ $(grep "$1" $FILENAME|wc -l) -eq 1 ];then
         sed -i "/$1/d" $FILENAME
         action "$1 del success!!!" /bin/true
      else
         action "$1 is not exist!!!" /bin/false
      fi
      ;;
    -s|-search)
      shift 1
       if [ $(grep "$1" $FILENAME|wc -l) -eq 1 ];then
         action "$1 is exist!!!" /bin/true
      else
         action "$1 is not exist!!!" /bin/false
      fi
      ;;
      *)
         echo "Usage $0 [-add|-del|-search] username!!!"
         exit 1
 esac     

测试脚本

posted @ 2020-10-12 11:16  yaowx  阅读(2539)  评论(0编辑  收藏  举报