(030) Linux之流控制case分支

十年运维系列之基础篇 - Linux

作者:曾林

联系:[email protected]

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

  本章节将继续讲解流控制的内容。在上面讲解if控制流分支中,我们构建了一个简单的菜单,并建立了用于响应用户选择的逻辑。为达到这个目的,我们使用了一系列的if命令来确定哪个是选中项。这种类型的程序构造经常会被使用到,所以许多编程语言(包括shell)为基于多项选择的判断提供了流控制机制。

二、case命令

  bash的多项选择复合命令被称为case,其语法如下所示:

case word in
    pattern [| pattern ]...)     commands ;;
esac

  回顾以下的脚本程序,可以看到用于响应用户选择的逻辑如下所示:

 1 #!/bin/bash
 2
 3 # foo.sh : a menu driven system information program
 4
 5 clear
 6 echo    "
 7 Please Select:
 8
 9 1.  Display System information
10 2.  Display Disk Space
11 3.  Display Home Space Utilization
12 0.  Quit
13 "
14
15 read -p "Enter selection [0 ~ 3] > "
16
17 if  [[ $REPLY =~ ^[0-3]$ ]]; then
18     if  [[ $REPLAY == 0 ]]; then
19         echo "Program terminated."
20         exit
21     fi
22
23     if  [[ $REPLY == 1 ]]; then
24         echo "Hostname: $HOSTNAME"
25         uptime
26         exit
27     fi
28
29     if  [[ $REPLY == 2 ]]; then
30         df -h
31         exit
32     fi
33
34     if  [[ $REPLY == 3 ]]; then
35         if  [[ $(id -u) == 0 ]]; then
36             echo "Home Space Utilization(All Users): "
37             du -sh /home/*
38         else
39             echo "Home Space Utilization:"
40             du -sh /$HOME
41         fi
42         exit
43     fi
44 else
45     echo "Invalid entry." >&2
46     exit 1
47 fi

在这里,如果使用case语句则可以简化以上的逻辑。具体如下代码:

 1 #!/bin/bash
 2
 3 # foo-case.sh:  a menu driven system information program
 4
 5 clear
 6 echo "
 7
 8 Please Select:
 9 1.  Display System Information
10 2.  Display Disk Space
11 3.  Display Home Space Utilization
12 0.  Quit
13 "
14
15 read -p "Enter selection [0~3]> "
16
17 case $REPLY in
18     0)
19         echo "Program terminated."
20         exit
21         ;;
22     1)  echo "Hostname: $HOSTNAME"
23         uptime
24         ;;
25     2)  df -h
26         ;;
27     3)  if [[ $(id -u) == 0 ]]; then
28             echo "Home Space Utilization(All Users)"
29             du -sh /home/*
30         else
31             echo "Home Space Utilizaiton"
32             du -sh /$HOME
33         fi
34         ;;
35     *)
36         echo "Invalid entry" >&2
37         exit 1
38         ;;
39 esac

case命令将关键字的值——本例中,即$REPLY的值——与特定的模式相比较,若发现吻合的模式后,将不再对比剩余的模式。

1. 模式

  同路径名展开一样,case使用以“)”字符结尾的模式。下表展示了一些有效的模式。

模式 描述
a) 若关键字为a则吻合
[[:alpha:]]) 若关键字为单个字母则吻合
???) 若关键字为三个字符则吻合
*.txt) 若关键字以.txt结尾则吻合
*) 与任何关键字吻合。在case命令的最后的一个模式应用此项是个不错的做法,可对应所有前模式不吻合的关键字,也就是对应任何可能的无效值

  下面是一个使用模式的范例。

时间: 2024-07-31 22:16:47

(030) Linux之流控制case分支的相关文章

Shell脚本 (三)for循环 while循环 case分支语句

################for循环语句的结构#############使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环.在这里,取值表 称为for语句的执行条件,其中包括多个属性相同的对象.需要预先指定(如通讯录.IP黑名单)·语法样式for 变量名 in 取值列表do 命令序列done·#####for循环语句列子####需求:根据人事部门给出的员工姓名拼音列表,在Linux服务器中添加相应的用户账号,初始密码均设

浅谈Shell脚本中for循环、while循环及case分支语句

博文目录一.for循环语句二.使用while循环语句三.使用case分支语句 一.for循环语句 当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常繁琐,困难重重.这将可以使用for循环语句很好的解决类似问题. 1.for语句的结构 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环.在这里,"取值列表"称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通

shellwhile循环,C-for循环,until循环,case分支结构,流程控制语句

while 循环结构 while 条件判断表达式 do 条件判断成立时执行的语句块 ...... ...... done 例:使用while循输出数字1到10(升序输出) j=1 while [ $j -le 10 ] do #useradd wsyht$j #userdel -r wsyht$i echo $j let j++   #j=j+1 done C-for循环结构 for((赋初值;条件判断;步长)) do 条件判断成立时执行的操作 ...... done for((i=1;i<=5

与您共享Linux Kernel 4.8分支首个维护版本

导读 Linux Kernel 4.8正式版于10月2日由Linus Torvalds发布,带来了包括AMDGPU OverDrive支持.NVIDIA Pascal支持.AMDGPU PowerPlay改善.树莓派3的Broadcom BCM2837新品和微软Surface 3 Touch主控等支持. 拥有极高声望的Linux Kernel维护工程师Greg Kroah-Hartman于今天推出了Linux Kernel 4.8分支的首个维护版本. Greg Kroah-Hartman说道:“

Shell脚本之for、while循环语句和case分支语句

shell作为一种脚本编程语言,同样包含循环.分支等其他程序控制结构,从而轻松完成更加复杂.强大的功能 使用for循环语句 在工作中,经常遇到某项任务需要多次执行,而每次执行仅仅是处理对象不一样,其他命令都相同.使用简单的if语句已经难以满足要求,编写全部代码将困难重重,而for循环语句将很好的解决类似的问题 1. for语句的结构 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令,直到变量值用完退出循环 案例1:根据姓名列表批量建立用户 [[ema

Shell基础(三):使用for循环结构、使用while循环结构、基于case分支编写脚本、使用Shell函数、中断及退出

一.使用for循环结构 目标: 本案例要求编写一个Shell脚本chkhosts.sh,利用for循环来检测多个主机的存活状态,相关要求及说明如下: 1> 对192.168.4.0/24网段执行ping检测      2> ping检测可参考前一天的pinghost.sh脚本      3> 脚本能遍历ping各主机,并反馈存活状态 执行检测脚本以后,反馈结果如下图所示. 方案: 在Shell脚本应用中,常见的for循环采用遍历式.列表式的执行流程,通过指定变量从值列表中循环赋值,每次复

策略模式重构switch/case分支代码

通过策略模式来重构优化代码里面的switch/case分支代码.极大程度上提高了程序的扩展性.当然,如果分支比较多,每次都需要新增加一个类,这的确是有点麻烦,可以考虑使用反射来实现. 代码: namespace DP { public enum State { Alaska, NewYork, Florida } // 抽象 //public interface IShippingInfo //{ // decimal Calculate(State state); //} public cla

shell编程之case分支语句

shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 如果里面匹配到固定值:或某个变量存在多中取值,需要对其中的每一个取值分别执行不同的命令序列. case只是判断一个变量的不同取值. case的模式: 执行流程: 首先使用"变量值"与模式1进行比较,如果取值相同就执行模式1的命令序列1,直到遇见" ;; "后跳转到es

js中switch/case分支的值可以是变量或表达式

在一些高级语言如C#中,switch分支的值只能是常量,而js中可以是变量或表达式: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.