Shell也支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句。当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。

if else 语句与case in语句的对比

 
脚本
易错点与知识点
if else语句
  1. #!/bin/bash
  2. read -p 'please input the month: ' month
  3. if ((month>=3 && month<=5))
  4. then echo 'spring'
  5. elif ((month>=6 && month<=8))
  6. then  echo 'summer'
  7. elif ((month>=9 && month<=11))
  8. then echo 'autumn'
  9. elif ((month==12 ||(month<=2&&month>0)))
  10. then echo 'winter'
  11. else
  12. echo 'the month is error'
  13. fi
  1. 使用((month==12 ||(month<=2&&month>0)))时,注意使用()将复杂逻辑括起来,避免混淆
  2. 使用((month==12 ||(month<=2&&month>0)))时,只能用month==12不能month=12,因为使用month=12会将month重新赋值,影响后续判断
case in语句
  1. !/bin/bash
  2. read -p 'please input the month: ' month
  3. case $month in
  4. [3-5])
  5. echo 'spring';;
  6. [6-8])
  7. echo 'summer';;
  8. 9|10|11)
  9. echo 'autumn';;
  10. 12|1|2)
  11. echo 'winter';;
  12. *)
  13. echo 'the month is error'
  14. esac
  1. 不能使用[9-11]代表9到11的范围
  2. 使用|表示多重选择

case in语句的用法

用法
说明
case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    ……
    *)
        statementn
esac

1. case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。

  • expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
  • pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。

2. case 会将 expression  的值与 pattern1、pattern2、pattern3 逐个进行匹配:

  • 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
  • 如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分。

3. 对*)的几点说明:

  • *)部分可以省略,*)部分主要用于在 expression 没有匹配到任何一个模式时做一些“善后”工作,或者给用户一些提示

除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。

case in 和正则表达式

case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:

格式
说明
* 表示任意字符串。
[abc] 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。
[m-n] 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
| 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。

如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式来匹配的;最后一个分支*)并不是什么语法规定,它只是一个正则表达式,*表示任意字符串,所以不管 expression 的值是什么,*)总能匹配成功。

下面的例子演示了如何在 case in 中使用正则表达式:

脚本
结果
  1. #!/bin/bash
  2. printf "Input a character: "
  3. read -n 1 char
  4. case $char in
  5. [a-zA-Z])
  6. printf "\nletter\n"
  7. ;;
  8. [0-9])
  9. printf "\nDigit\n"
  10. ;;
  11. [,.?!])
  12. printf "\nPunctuation\n"
  13. ;;
  14. *)
  15. printf "\nerror\n"
  16. esac
运行结果1:
Input integer number: S
letter

运行结果2:
Input integer number: ,
Punctuation

12 shell case in语句的更多相关文章

  1. Shell case in语句详解

    和其它编程语言类似,Shell 也支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句.在<Shell if else>一节中我们讲解了 if else 语句 ...

  2. Shell case esac语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  3. 【Shell脚本学习17】Shell case esac语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  4. Shell case esac语句【转】

    本文转载自:http://c.biancheng.net/cpp/view/7006.html C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学: ...

  5. Shell脚本应用(for、while循环语句和case分支语句)

    1.for:读取不同的变量值,逐个执行同一组命令,直到取值完毕退出,变量值以空格分隔 语法: for  变量值  in  取值列表 do 命令序列 done 2.while:重复测试某个条件,成立则执 ...

  6. linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载

    http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...

  7. [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例

    原文链接:http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html linux shell有一套自己的流程控制语句,其中包括条件语句 ...

  8. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  9. shell脚本中的case条件语句介绍和使用案例

    #前言:这篇我们接着写shell的另外一个条件语句case,上篇讲解了if条件语句.case条件语句我们常用于实现系统服务启动脚本等场景,case条件语句也相当于if条件语句多分支结构,多个选择,ca ...

随机推荐

  1. JavaWeb Session 状态管理

    引言 HTTP 协议是一个无状态的协议,简单理解就是两次请求/响应无法记录或保存状态信息.但是动态 Web 项目开发是需要保存请求状态的,比如用户的登录状态,但 HTTP 协议层不支持状态保存,所以需 ...

  2. docker存储驱动

    http://www.sohu.com/a/101016494_116235 https://success.docker.com/article/compatibility-matrix Red H ...

  3. java 集合梳理

    使用 processOn 画的java 集合图谱,应付面试应该可以了

  4. 如何实现一个简易版的 Spring - 如何实现 AOP(中)

    前言 在上篇 如何实现 AOP(上) 介绍了 AOP 技术出现的原因和一些重要的概念,在我们自己实现之前有必要先了解一下 AOP 底层到底是如何运作的,所以这篇再来看看 AOP 实现所依赖的一些核心基 ...

  5. 炫彩流光按钮 CSS + HTML

    炫彩流光按钮 写在前面 你若要喜爱你自己的价值,你就得给世界创造价值.--歌德 效果图 三个绝美的样例 HTML代码 <div class="box"> <but ...

  6. 如何使用TVM Pass红外线

    如何使用TVM Pass红外线 随着Relay / tir中优化遍数的增加,执行并手动维护其依赖关系变得很棘手.引入了一个基础结构来管理优化过程,将其应用于TVM堆栈中IR的不同层. Relay / ...

  7. Yolov3 的 OneFlow 实现

    Yolov3 的 OneFlow 实现 1.简介 YOLO 系列的算法(经典的v1~v3),是单阶段目标检测网络的开山鼻祖,YOLO-You only look once,表明其单阶段的特征,正是由于 ...

  8. TensorFlow csv读取文件数据(代码实现)

    TensorFlow csv读取文件数据(代码实现) 大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 Tens ...

  9. nvGRAPH API参考分析(二)

    nvGRAPH API参考分析(二) nvGRAPH Code Examples 本文提供了简单的示例. 1. nvGRAPH convert topology example void check( ...

  10. Recommenders with TensorRT

    Recommenders with TensorRT 推荐系统用于向社交网络.媒体内容消费和电子商务平台的用户提供产品或媒体推荐.基于MLP的神经协作滤波器(NCF)推荐器使用一组完全连接或矩阵乘法层 ...