AI智能
改变未来

Linux Bash Shell编程(九):流程控制语句(上) 分支语句(if、case)


  上一节中,我们学习了Bash中各种类型的条件判断语句。在Bash中,流程控制是条件判断语句的最终目的,条件判断语句是流程设计的基础条件。本节开始我们就来一起探索Bash中的流程控制语句,首先我们会了解到分支语句

if

case

if 判断语句

 简介

  流程控制是编程语言基础中的基础,

if

语句和

case

语句一起实现了程序语言的三种结构(顺序结构、分支结构、循环结构)之一的分支结构。简单说,

if

语句判断了条件的真假,定义了条件为真做什么(,为假做什么)。

 语法

#单分支if语句if [ 判断条件 ]; then动作fi#或者if [ 判断条件 ]then动作fi#多分支if语句if [ 判断条件1 ]; then动作1elif [ 判断条件2 ]; then动作2elif [ 判断条件3 ]; then动作3...else动作nfi

 注意

  • 小知识:在Shell脚本中使用

    cd

    命令仅对脚本内部有效,不影响外部环境

  • 若要设定脚本的返回值,使用

    exit

    命令后跟返回值可完成

exit 0 #以0为返回值退出,默认exit 1 #以1为返回值退出,一般为发生错误或中断

 示例

示例1:利用(七)中所学字符串截取操作获取根目录文件系统占用率并在过高时报警

#以下是脚本df中内容#!/bin/bash#Author:Zhengdeclare -i aa=$(df | grep \"/$\" | awk \'{print $5}\' | cut -d \"%\" -f 1)if [ $a -lt 80 ]; then #条件判断语句在后面内容中会讲到echo \"Storage space normal\" #如果a小于80elseecho \"Warning:Not enough storage space\" #如果a大于80fiecho -e \"root storage used $a%\"

示例2:应用多分支语句判断变量值的范围(仅作为多分支测试使用)

#!/bin/bash#Author: Zhengread -p \"Input a: \" aif [ $a -lt 30 ]; thenecho \"a<30\"elif [ $a -lt 80 ]; thenecho \"30<=a<80\"elseecho \"a>=80\"fi

case 判断语句

 简介

  同样作为分支顺序语句,case与if存在一定差别。case语句只能判断一种条件的不同关系,而if语句可以判断多种条件关系。但在一种条件的不同关系判断中,case语句更加简单,一般用于多项选择(仅适用于字符串匹配),支持通配符

 基本语法

case $变量名 in\"值1\") #变量值为值1动作1;;\"值2\" | \"值3\") #变量值为值2或值3动作2;;...*)其余所有值,执行动作n;;esac

 注意

  • 语句的结束标志是将头部关键字倒序
  • 值可以是通配符,当值为通配符时,不可以加转义的
    \"\"

    ,否则将

    *

    当作普通字符处理

  • case条件支持正则表达式中的任意字符
    []
  • 当两个条件为或时,可以用
    |

    连接,当两条件有一个成立时改条即成立

 基本用法示例

#此示例读取一个成绩评级,并对各个评级作出回应#!/bin/bash#Author:Zhengread -p \"Please input your Grade(A\\B\\C\\D):\" -t 30 scase $s inA)echo -e \"Your grade is A!\\nYou are excellent! Congratulations!\";;B | C)echo -e \"Good,\\nplease keep it up!\";;D)echo -e \"You have failed this exam!\\nStill have to work hard!\";;*)echo -e \"Grade error!\\nPlease input A\\\\B\\\\C\\\\D\"esac

 拓展用法

  • 在基本用法中,如果变量符合一个条件,就会跳入执行对应动作,动作执行完毕直接跳出,而不会继续匹配剩余条件

  • 使用

    ;&

    代替

    ;;

    结束一个动作可以不跳出case语句,无论后面条件是否匹配,一律执行,直到出现

    ;;

    例如,这个示例中使用

    ;&

    号,匹配到了第一个条件,但执行了两个

    echo

    命令

#!/bin/bash#Author:Zhengt=\"AB\"case $t inA*)echo \"A*\";&*A) #实际上没有匹配echo \"*B\";&esac
  • 使用

    ;;&

    符号可进行类case嵌套,在一个条件的结尾处使用

    ;;&

    ,程序会转入下一层更精确的case语句中,内层的退出以及符号与正常相同

    #!/bin/bash#Author:Zhengread -p \"Please input a number(<100): \" acase $a in[7-10]*)echo \"70+\";;&?5)echo \"?5\";&?6)echo \"?6\";&?7)echo \"?7\";&*)echo \"?*\";;[6-7]*)echo \"60-70\";;&?5)echo \"65\";&?6)echo \"66\";&*)echo \"6*\";;esac

    索引

    下一节,Linux Bash Shell编程(十):流程控制语句(下) 循环语句(for while until)我们将一起了解流程控制中的循环语句

    上一节,Linux Bash Shell编程(八):条件判断与示例

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Linux Bash Shell编程(九):流程控制语句(上) 分支语句(if、case)