case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支.
在代码块中控制程序分支
case (in) / esac
在shell中的case结构与C/C++中的switch结构是相同的. 它允许通过判断来选择代码块中多条路径中的一条. 它的作用和多个if/then/else语句的作用相同, 是它们的简化结构, 特别适用于创建菜单.
- case "$variable" in
- "$condition1" )
- command...
- ;;
- "$condition2" )
- command...
- ;;
- esac
- Note
*
对变量使用""并不是强制的, 因为不会发生单词分割.
*
每句测试行, 都以右小括号)来结尾.
*
每个条件判断语句块都以一对分号结尾 ;;.
*
case块以esac (case的反向拼写)结尾.
例子 10-24. 使用case
- #!/bin/bash
- # 测试字符串范围.
- echo; echo "Hit a key, then hit return."
- read Keypress
- case "$Keypress" in
- [[:lower :]] ) echo "Lowercase letter" ;;
- [[:upper :]] ) echo "Uppercase letter" ;;
- [0-9] ) echo "Digit" ;;
- * ) echo "Punctuation, whitespace, or other";;
- esac # 允许字符串的范围出现在[中括号]中,
- #+ 或者出现在POSIX风格的[[双中括号中.
- # 在这个例子的第一个版本中,
- #+ 测试大写和小写字符串的工作使用的是
- #+ [a-z] 和 [A-Z].
- # 这种用法在某些特定场合的或某些Linux发行版中不能够正常工作.
- # POSIX 的风格更具可移植性.
- # 感谢Frank Wang指出了这点.
- # 练习:
- # -----
- # 就像这个脚本所表现出来的, 它只允许单次的按键, 然后就结束了.
- # 修改这个脚本, 让它能够接受重复输入,
- #+ 报告每次按键, 并且只有在"X"被键入时才结束.
- # 暗示: 将这些代码都用"while"循环圈起来.
- exit 0
例子 10-25. 使用case来创建菜单
- #!/bin/bash
- # 未经处理的地址资料
- clear # 清屏.