本文抄自:阮一峰 - Bash 脚本教程

语法结构

case结构用于多值判断,可以为每个值指定对应的命令,跟包含多个elifif结构等价,但是语义更好。它的语法如下:

1
2
3
4
5
6
7
case expression in
pattern )
commands ;;
pattern )
commands ;;
...
esac

上面代码中,expression是一个表达式,pattern是表达式的值或者一个模式,可以有多条,用来匹配多个值,每条以两个分号(;)结尾。

实例说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

echo -n "输入一个1到3之间的数字(包含两端)> "
read character

case $character in
1 )
echo 1
;;
2 )
echo 2
;;
3 )
echo 3
;;
* )
echo 输入不符合要求
;;
esac

上面例子中,最后一条匹配语句的模式是*,这个通配符可以匹配其他字符和没有输入字符的情况,类似ifelse部分。

下面是另一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

OS=$(uname -s)

case "$OS" in
FreeBSD)
echo "This is FreeBSD"
;;
Darwin)
echo "This is Mac OSX"
;;
AIX)
echo "This is AIX"
;;
Minix)
echo "This is Minix"
;;
Linux)
echo "This is Linux"
;;
*)
echo "Failed to identify this OS"
;;
esac

上面的例子判断当前是什么操作系统。

case的匹配模式可以使用各种通配符,下面是一些例子。

  • a):匹配a。
  • a|b):匹配ab
  • [[:alpha:]]):匹配单个字母。
  • ???):匹配3个字符的单词。
  • *.txt):匹配.txt结尾。
  • *):匹配任意输入,通过作为case结构的最后一个模式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

echo -n "输入一个字母或数字 > "
read character

case $character in
[[:lower:]] | [[:upper:]] )
echo "输入了字母 $character"
;;
[0-9] )
echo "输入了数字 $character"
;;
* )
echo "输入不符合要求"
;;
esac

上面例子中,使用通配符[[:lower:]] | [[:upper:]]匹配字母,[0-9]匹配数字。

Bash 4.0之前,case结构只能匹配一个条件,然后就会退出case结构。Bash 4.0之后,允许匹配多个条件,这时可以用;;&终止每个条件块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash

# test.sh
read -n 1 -p "Type a character > "
echo

case $REPLY in
[[:upper:]])
echo "'$REPLY' is upper case."
;;&
[[:lower:]])
echo "'$REPLY' is lower case."
;;&
[[:alpha:]])
echo "'$REPLY' is alphabetic."
;;&
[[:digit:]])
echo "'$REPLY' is a digit."
;;&
[[:graph:]])
echo "'$REPLY' is a visible character."
;;&
[[:punct:]])
echo "'$REPLY' is a punctuation symbol."
;;&
[[:space:]])
echo "'$REPLY' is a whitespace character."
;;&
[[:xdigit:]])
echo "'$REPLY' is a hexadecimal digit."
;;&
esac

执行上面的脚本,会得到下面的结果:

1
2
3
4
5
6
$ test.sh
Type a character > a
'a' is lower case.
'a' is alphabetic.
'a' is a visible character.
'a' is a hexadecimal digit.

可以看到条件语句结尾添加了;;&以后,在匹配一个条件之后,并没有退出case结构,而是继续判断下一个条件。

参考文档

  1. 阮一峰 - Bash 脚本教程