Shell脚本——流程控制:case分支 流程控制case分支1、case命令1.1、模式1.2、执行多次操作1、case命令在Bash中多重选择复合命令是case其用法如下casewordin[pattern[|pattern]...)commands;;]...esac如果查看前面的read-menu程序可以看到用户选择处理逻辑#!/bin/bash# read-menu: 菜单驱动的系统信息程序clearecho Please Select: 1. Display System Information 2. Display Disk Space 3. Display Home Space Utilization 0. Quit read-pEnter selection [0-3] if[[$REPLY~^[0-3]$]];thenif[[$REPLY0]];thenechoProgram terminated.exitfiif[[$REPLY1]];thenechoHostname:$HOSTNAMEuptimeexitfiif[[$REPLY2]];thendf-hexitfiif[[$REPLY3]];thenif[[$(id-u)-eq0]];thenechoHome Space Utilization (All Users)du-sh/home/*elseechoHome Space Utilization ($USER)du-sh$HOMEfiexitfielseechoInvalid entry.2exit1fi可以使用case简化用户选择处理逻辑#!/bin/bash# case-menu: 菜单驱动的系统信息程序clearecho Please Select: 1. Display System Information 2. Display Disk Space 3. Display Home Space Utilization 0. Quit read-pEnter selection [0-3] case$REPLYin0)echoProgram terminated.exit;;1)echoHostname:$HOSTNAMEuptime;;2)df-h;;3)if[[$(id-u)-eq0]];thenechoHome Space Utilization (All Users)du-sh/home/*elseechoHome Space Utilization ($USER)du-sh$HOMEfi;;*)echoInvalid entry2exit1;;esaccase命令查看word的值在这个例子中就是RELPY变量的值然后将其与patterns指定的模式匹配。如果找到匹配则执行与该模式关联的命令之后不再尝试进行其他匹配。1.1、模式case使用的模式与路径名扩展使用的模式一样模式以结尾。下表描述了case模式示例。来看一个模式应用示例#!/bin/bashread-penter word case$REPLYin[[:alpha:]])echois a single alphabetic character.;;[ABC][0-9])echois A, B, or C followed by a digit.;;???)echois three characters long.;;*.txt)echois a word ending in .txt;;*)echois something else.;;esac也可以使用|作为分隔符将多个模式组合在一起形成“逻辑或”​or关系的条件模式。这在同时处理大小写字母的时候很有用例如#!/bin/bash# case-menu: 菜单驱动的系统信息程序clearecho Please Select: A. Display System Information B. Display Disk Space C. Display Home Space Utilization Q. Quit read-pEnter selection [A, B, C or Q] case$REPLYinq|Q)echoProgram terminated.exit;;a|A)echoHostname:$HOSTNAMEuptime;;b|B)df-h;;c|C)if[[$(id-u)-eq0]];thenechoHome Space Utilization (All Users)du-sh/home/*elseechoHome Space Utilization ($USER)du-sh$HOMEfi;;*)echoInvalid entry2exit1;;esac1.2、执行多次操作在Bash 4.0之前case只允许在成功的匹配分支上执行一次操作。操作结束后case命令随之终止。来看一个字符匹配脚本#!/bin/bash# case4-1: 测试一个字符read-n1-pType a character echocase$REPLYin[[: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执行结果如下[melinuxbox ~]$ case4-1 Type a characteraais lower case.该脚本在大部分情况下管用但如果某个字符能够匹配多个POSIX字符类就不行了。例如字符a既是小写字母又是字母还是十六进制数位。在Bash 4.0之前case无法匹配多个分支。现代版本的Bash添加了;;语法允许继续测试下一个模式因此将上述代码改写为#!/bin/bash# case4-2: 测试一个字符read-n1-pType a character echocase$REPLYin[[: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执行结果如下[melinuxbox ~]$ case4-2 Type a characteraais lower case.ais alphabetic.ais a visible character.ais a hexadecimal digit.有了;;case就可以继续测试模式而不再直接终止。