条件判断
条件判断,顾名思义,就是对当前参数进行相关条件的比较,如果符合要求就进行相对应的操作,条件语句涉及到两种语法,if和case,两种语法都各具特色,我们可以通过实例来进行比较
if语句
if [判断条件1]; then
条件为真的分支代码
elif [判断条件2]; then
条件为真的分支代码
elif [判断条件3]; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
以上就是if判断语句的基本结构,执行代码时,由上向下,下对条件1进行判断,如果条件符合条件1,就运行条件1下的分支代码,分支代码完成后,直接退出if判断,不在向下判断;如若对条件1判断时,并不符合条件,就忽略条件1的分支代码,再由顺序向下判断是否符合条件2的条件,符合条件就执行条件2的分支代码,不符合就选择跳过,以此向下,直至else关键字,else关键字之后的分支代码,是对在以上条件都不符合的条件下,进行执行的代码,最后别忘了尾部的fi,其就是判断语句if头部的发序书写,标志着判断的结束。
基本解释已经完成,那么我们现在带入实例中进行讲解。
在日常的考试中,我们的考试成绩都会被老师评级的,那么我们可以写一个脚本实例,来完成自动分级操作。
1 #!/bin/bash
2 read -p "请输入成绩" score <==read进行交互录入变量
3 if [ $score -lt 60 ];then <==判断变量,是否小于60
4 echo "不及格" <==执行分支代码
5 elif [ $score -lt 75 ];then <==判断变量,是否小于75
6 echo "及格" <==执行分支代码
7 elif [ $score -lt 85 ];then <==判断变量,是否小于85
8 echo "中" <==执行分支代码
9 elif [ $score -lt 90 ];then <==判断变量,是否小于90
10 echo "良好" <==执行分支代码
11 elif [ $score -le 100 ];then <==判断变量,是否小于等于100
12 echo "优秀" <==执行分支代码
13 else <==以上判断都不符合,执行
14 echo "输入成绩无效" <==执行分支代码
15 fi
以上代码就完成了基本的成绩分级,运用if语句对区域条件的判断功能,输出对应的分支语句,但是指的注意的是,if语句所判断的都是连续的范围条件,对于离散型条件的判断,不能说无法完成,但是代码书写起来很是繁琐麻烦,那么这里,我们就要运用case这个条件判断语句了,其相较于if的优势也在于此
case语句
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
可以看到,以上就是case语句的基本结构,原理与if基本相似,由上向下,以此对PAT条件进行判断,符合条件就执行分支代码,值得注意的是,结尾可以用*来代表未列出的其余条件,来补充未列出条件所应执行的分支代码,case不光只支持*的用法,还有很多用法可以补充
*)
?)
[a-z])
a|z)
以上分别代表
任意长度的字符串
一个任意字符串
a-z范围内一个小写字母
a或者z
这就是case所支持的通配符写法,合理运用,可以使代码更简单明了。
那么我们结合实例,学习case语句
1 #!/bin/bash
2 cat << EFO <==菜单输出
3 1)包子
4 2)炒饭
5 3)饺子
6 4)面条
7 5)套餐
8 6)外卖
9 quit)退出
10 EFO
11 read -p "输入点餐号码" i <==交互读取参数
12 case $i in
13 1) <==参数为1执行
14 echo "10元"
15 ;;
16 2|3) <==参数为2或3执行
17 echo "15元"
18 ;;
19 [4-6]) <==参数为4到6执行
20 echo "20元"
21 ;;
22 quit) <==参数为quit执行
23 echo "退出成功"
24 exit
25 ;;
26 *) <==以上都不符合,执行
27 echo "没有该选项"
28 ;;
29 esac
以上代码实现了基本菜单功能的实现,可以观察到,对于离散型参数的判断代码远远优与if语句的设定,不仅仅是因为其支持通配符的使用,也应为其代码更加简洁易读,但有一点需要注意,case语句之后跟的不是变量名,而是变量的用用,也就是$i而不是i。
特殊用法
执行以上代码可以注意到,菜单选完一项就退出了脚本,不能满足多项的选择,那么我们可以用linux内部设定的一个语句select与case相结合来完成这种菜单的制定
select variable in list
do
循环体命令
done
select 从本质上讲是一个死循环,简单来说就是进行一次操作就执行一次循环体,不退出,具体的循环我们之后博客在详述,这里只是简单理解下,结合case语句,就可以实现循环执行的餐单脚本
1 #!/bin/bash
2 PS3="你的选择:" <==设定select提示符样式
3 select i in 包子 饺子 面条 盖饭 羊汤 外卖 quit退出;do <==菜单,循环体开始
4 case $REPLY in <==$REPLY传递select序号后字符串给case
5 1)
6 echo "10元"
7 ;;
8 2|3)
9 echo "15元"
10 ;;
11 [4-6])
12 echo "20元"
13 ;;
14 quit)
15 echo "退出成功"
16 exit
17 ;;
18 *)
19 echo "没有该选项"
20 ;;
21 esac
22 done <==循环体结束
以上代码完成了预期功能,其中要注意的就是$PS3和$REPLY变量的设定,$PS3储存的是对于select语句提示符的格式,合理的修改可以使得菜单更加容易阅读及其操作,而$REPLY是指用户在selelct语句中选择序号后,将序号储存在该变量之中,然后传递给case进行调用。
总结
经过实例的分析,我们了解到,if更适合于范围条件的判断,而case更适合离散型条件的筛选判断,合理的选择判断语句,可以使得代码更合理易读,并且简洁。