条件判断

条件判断,顾名思义,就是对当前参数进行相关条件的比较,如果符合要求就进行相对应的操作,条件语句涉及到两种语法,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更适合离散型条件的筛选判断,合理的选择判断语句,可以使得代码更合理易读,并且简洁。