十、Shell之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
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
#! /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
#!/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
#! /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
测试脚本
I have a dream so I study hard!!!