第二十六章 流程控制: case分支
第二十六章 流程控制: case分支
很多编程语言都提供了专门处理多重选择的流程控制机制,Shell也是如此,其它编程语言拥有switch-case语句,而Shell中拥有case语句。
case命令
在Bash中,多重选择复合命令是case,其用法如下:
case word in[pattern [| pattern]...) commands ;;]...
esac
其中pattern是模式,当word和模式匹配按照先后顺序,只执行第一个匹配到的模式的commands。
case模式示例
模式 | 描述 |
---|---|
a) | 如果word是a,则匹配 |
[[:alpha]]) | 如果word是单个字母,则匹配 |
???) | 如果word是3个字符,则匹配 |
*.txt) | 如果word是以.txt结尾,则匹配 |
*) | 不管word是什么内容,均可匹配。将该模式作为case命令最后一个模式是一种不错的做法,可以匹配之前模式无法匹配的内容。 |
例如:
#!/bin/bashread -p "enter word > "case "$REPLY" in[[:alpha:]]) echo "is a single alphabetic character." ;;[ABC][0-9]) echo "is A, B, or C followed by a digit." ;;???) echo "is three characters long." ;;*.txt) echo "is a word ending in '.txt'" ;;*) echo "is something else." ;;
esac
也可以使用分割符,将多个模式组合在一起,形成“逻辑或”(or)关系的条件模式。这在同时处理大小写字母时很有用,例如:
#!/bin/bashclear
echo "
Please Select:A. Display System Information
B. Display Disk Space
C. Display Home Space Utilization
Q. Quit
"
read -p "Enter selection [A, B, C or Q] >"case "$REPLY" inq|Q) echo "Program terminated."exit;;a|A) echo "Hostname: $HOSTNAME"uptime;;b|B) df -h;;c|C) if [[ "$(id -u)" -eq 0 ]]; thenecho "Home Space Utilization (All users)"du -sh /home/*elseecho "Home Space Utilization ($USER)"du -sh "$HOME"fi;;*) echo "Invalid entry" >&2exit 1;;
esac
执行多次操作
在Bash4.0之前,case无法匹配多个分支。现代版本Bash添加了;;&语法,允许继续测试下一个模式。
例如:
#!/bin/bash#case4-2: 测试一个字符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 aphabetic." ;;&[[:digit:]]) echo "'$REPLY' is a digit." ;;&[[:graph:]]) echo "'$REPLY' is a visible character." ;;&[[:punct:]]) echo "'$REPLY' is a punctuation symbol." ;;&[[:space:]]) echo "'$REPLY' is awhitespace character." ;;&
esac
运行结果如下: