上一节中,我们学习了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编程(八):条件判断与示例