sh4.case语句

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

 1 casein
 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.

 

posted @ 2016-11-14 17:43  信子2016  阅读(211)  评论(0编辑  收藏  举报