Shell脚本——流程控制:case分支
2026/9/9 19:49:29 网站建设 项目流程

流程控制: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-p"Enter selection [0-3] > "if[["$REPLY"=~^[0-3]$]];thenif[["$REPLY"==0]];thenecho"Program terminated."exitfiif[["$REPLY"==1]];thenecho"Hostname:$HOSTNAME"uptimeexitfiif[["$REPLY"==2]];thendf-hexitfiif[["$REPLY"==3]];thenif[["$(id-u)"-eq0]];thenecho"Home Space Utilization (All Users)"du-sh/home/*elseecho"Home Space Utilization ($USER)"du-sh"$HOME"fiexitfielseecho"Invalid 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-p"Enter selection [0-3] > "case"$REPLY"in0)echo"Program terminated."exit;;1)echo"Hostname:$HOSTNAME"uptime;;2)df-h;;3)if[["$(id-u)"-eq0]];thenecho"Home Space Utilization (All Users)"du-sh/home/*elseecho"Home Space Utilization ($USER)"du-sh"$HOME"fi;;*)echo"Invalid entry">&2exit1;;esac

case命令查看word的值,在这个例子中,就是RELPY变量的值,然后将其与patterns指定的模式匹配。如果找到匹配,则执行与该模式关联的命令,之后不再尝试进行其他匹配。

1.1、模式

case使用的模式与路径名扩展使用的模式一样,模式以)结尾。下表描述了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/bash# case-menu: 菜单驱动的系统信息程序clearecho" 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)"-eq0]];thenecho"Home Space Utilization (All Users)"du-sh/home/*elseecho"Home Space Utilization ($USER)"du-sh"$HOME"fi;;*)echo"Invalid entry">&2exit1;;esac

1.2、执行多次操作

在Bash 4.0之前,case只允许在成功的匹配分支上执行一次操作。操作结束后,case命令随之终止。来看一个字符匹配脚本:

#!/bin/bash# case4-1: 测试一个字符read-n1-p"Type a character > "echocase"$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

执行结果如下:

[me@linuxbox ~]$ case4-1 Type a character>a'a'is lower case.

该脚本在大部分情况下管用,但如果某个字符能够匹配多个POSIX字符类,就不行了。例如,字符a既是小写字母又是字母,还是十六进制数位。在Bash 4.0之前,case无法匹配多个分支。现代版本的Bash添加了;;&语法,允许继续测试下一个模式,因此将上述代码改写为:

#!/bin/bash# case4-2: 测试一个字符read-n1-p"Type a character > "echocase"$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

执行结果如下:

[me@linuxbox ~]$ case4-2 Type a character>a'a'is lower case.'a'is alphabetic.'a'is a visible character.'a'is a hexadecimal digit.

有了;;&,case就可以继续测试模式,而不再直接终止。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询