case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:1 case 值 in 2 模式1) 3 command1 4 command2 5 command3 6 ;; 7 模式2) 8 command1 9 command210 command311 ;;12 *)13 command114 command215 command316 ;;17 esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。例1,
1 echo 'Input a number between 1 to 4' 2 echo 'Your number is:\c' 3 read aNum 4 case $aNum in 5 1) echo 'You select 1' 6 ;; 7 2) echo 'You select 2' 8 ;; 9 3) echo 'You select 3'10 ;;11 4) echo 'You select 4'12 ;;13 *) echo 'You do not select a number between 1 to 4'14 ;;15 esac16 17 18 # read 输入语句 类似 input 19 输入不同的内容,会有不同的结果,例如:20 Input a number between 1 to 421 Your number is:322 You select 3
例2:
1 #!/bin/bash 2 option="${1}" 3 case ${option} in 4 -f) FILE="${2}" 5 echo "File name is $FILE" 6 ;; 7 -d) DIR="${2}" 8 echo "Dir name is $DIR" 9 ;;10 *) 11 echo "`basename ${0}`:usage: [-f file] | [-d directory]"12 exit 1 # Command to come out of the program with status 113 ;;14 esac15 16 17 [root@localhost test]# ./case2.sh -d ddsss18 Dir name is ddsss19 [root@localhost test]# ./case2.sh -f ddsss20 File name is ddsss
练习:写一个脚本 showlogged.sh, 其用法格式为:
showlogged.sh -v -c -h|--help
其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户,如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的用户的相关信息:
1 #/bin/bash 2 # 3 declare -i SHOWNUM=0 4 declare -i SHOWUSERS=0 5 6 for I in `seq 1 $#`;do 7 if [ $# -gt 0 ];then 8 case $1 in 9 -h|--help)10 echo "Usage:`basename $0` -h|--help -c|count -v|--verbose"11 exit 0 ;;12 -v|--verbose)13 let SHOWUSERS=114 shift ;;15 -c|--count)16 let SHOWNUM=117 shift ;;18 *)19 echo "Usage:`basename $0` -h|--help -c|count -v|--verbose"20 exit 8 ;;21 esac22 fi23 done24 if [ $SHOWNUM -eq 1 ];then25 echo "Logged users:`who | wc -l`."26 if [ $SHOWUSERS -eq 1 ];then27 echo "They are:"28 who29 fi30 fi31 32 33 34 [root@beary test]# ./case4.sh -c35 Logged users:2.36 [root@beary test]# ./case4.sh -c -v37 Logged users:2.38 They are:39 root tty1 2016-10-25 15:2240 root pts/0 2016-11-14 15:20
添加,删除用户脚本:
case 优化版
-v 显示执行过程,-add ,-del 可同时使用
1 [root@beary test]# cat case3.sh 2 #/bin/bash 3 # 4 DEBUG=0 5 ADD=0 6 DEL=0 7 8 for I in `seq 0 $#`;do 9 if [ $# -gt 0 ];then10 case $1 in11 -v|--verbose)12 DEBUG=113 shift14 ;;15 -h|--help)16 echo "Usage:`basename $0` -add USER_LIST -del USER_LIST -v|--verbose -h|--help"17 exit 018 ;;19 -add)20 ADD=121 ADDUSERS=$222 shift 223 ;;24 -del)25 DEL=126 DELUSERS=$227 shift 228 ;;29 *)30 echo "Usage:`basename $0` -add USER_LIST -del USER_LIST -v|--verbose -h|--help"31 exit 732 ;;33 esac34 fi35 done36 37 if [ $ADD -eq 1 ];then38 for USER in `echo $ADDUSERS | sed 's#,# #g'`;do39 if id $USER &> /dev/null;then40 [ $DEBUG -eq 1 ] && echo "$USER exists."41 else42 useradd $USER43 [ $DEBUG -eq 1 ] && echo "Add user $USER finished."44 fi45 done46 fi47 48 if [ $DEL -eq 1 ];then49 for USER in `echo $DELUSERS | sed 's#,# #g'`;do50 if id $USER &> /dev/null;then51 userdel -r $USER52 [ $DEBUG -eq 1 ] && echo "Del user $USER finished."53 else54 [ $DEBUG -eq 1 ] && echo "$USER no such!!"55 fi56 done57 fi58 59 60 [root@beary test]# ./case3.sh -v -add xin,fd,dd,dfdkl -del xin,fd,dd61 Add user xin finished.62 Add user fd finished.63 Add user dd finished.64 Add user dfdkl finished.65 Del user xin finished.66 Del user fd finished.67 Del user dd finished.