sh4.case语句
case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
1 case 值 in 2 模式1) 3 command1 4 command2 5 command3 6 ;; 7 模式2) 8 command1 9 command2 10 command3 11 ;; 12 *) 13 command1 14 command2 15 command3 16 ;; 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 esac 16 17 18 # read 输入语句 类似 input 19 输入不同的内容,会有不同的结果,例如: 20 Input a number between 1 to 4 21 Your number is:3 22 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 1 13 ;; 14 esac 15 16 17 [root@localhost test]# ./case2.sh -d ddsss 18 Dir name is ddsss 19 [root@localhost test]# ./case2.sh -f ddsss 20 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=1 14 shift ;; 15 -c|--count) 16 let SHOWNUM=1 17 shift ;; 18 *) 19 echo "Usage:`basename $0` -h|--help -c|count -v|--verbose" 20 exit 8 ;; 21 esac 22 fi 23 done 24 if [ $SHOWNUM -eq 1 ];then 25 echo "Logged users:`who | wc -l`." 26 if [ $SHOWUSERS -eq 1 ];then 27 echo "They are:" 28 who 29 fi 30 fi 31 32 33 34 [root@beary test]# ./case4.sh -c 35 Logged users:2. 36 [root@beary test]# ./case4.sh -c -v 37 Logged users:2. 38 They are: 39 root tty1 2016-10-25 15:22 40 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 ];then 10 case $1 in 11 -v|--verbose) 12 DEBUG=1 13 shift 14 ;; 15 -h|--help) 16 echo "Usage:`basename $0` -add USER_LIST -del USER_LIST -v|--verbose -h|--help" 17 exit 0 18 ;; 19 -add) 20 ADD=1 21 ADDUSERS=$2 22 shift 2 23 ;; 24 -del) 25 DEL=1 26 DELUSERS=$2 27 shift 2 28 ;; 29 *) 30 echo "Usage:`basename $0` -add USER_LIST -del USER_LIST -v|--verbose -h|--help" 31 exit 7 32 ;; 33 esac 34 fi 35 done 36 37 if [ $ADD -eq 1 ];then 38 for USER in `echo $ADDUSERS | sed 's#,# #g'`;do 39 if id $USER &> /dev/null;then 40 [ $DEBUG -eq 1 ] && echo "$USER exists." 41 else 42 useradd $USER 43 [ $DEBUG -eq 1 ] && echo "Add user $USER finished." 44 fi 45 done 46 fi 47 48 if [ $DEL -eq 1 ];then 49 for USER in `echo $DELUSERS | sed 's#,# #g'`;do 50 if id $USER &> /dev/null;then 51 userdel -r $USER 52 [ $DEBUG -eq 1 ] && echo "Del user $USER finished." 53 else 54 [ $DEBUG -eq 1 ] && echo "$USER no such!!" 55 fi 56 done 57 fi 58 59 60 [root@beary test]# ./case3.sh -v -add xin,fd,dd,dfdkl -del xin,fd,dd 61 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.