文章目录
- [ul]前言
- 什么是case语句
- case语句语法分析
- case实战案例
- 总结
- 1. 做出你的选择
- 2. 早饭吃什么
- 3. apache服务启动脚本实战
[/ul]
前言
前面我们探讨过shell脚本中的if语句,单分支,双分支以及多分支的写法,今天我来看另一个流程控制语句case。
什么是case语句
控制语句:用来实现对程序流程的选择、循环、转向和返回等进行控制;
case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
case语句适合用于多分支,多选择的情况,是一个多选选择语句。
case语句语法分析
case 变量名 in 值1) 指令1 ;; 值2) 指令2 ;; 值3) 指令3 ;; *) 指令3 ;; esac
中文范例,我们喜欢用中文例子来看编程:
case “各位” in 找到好工作)给父母买买买;;天上掉金子)给自己买买买;;天上掉女朋友)给女朋友买买买*)还是老老实实学习吧!!esac
case语句的语法规范**
- 表达式expr按顺序匹配每个模式,一旦匹配成功,则执行该模式后面的命令块,然后退出case语句
- 如果没有找到匹配的模式,则执行默认值’’)’‘后的命令块, ‘’)’\’可以没有
- 模式中可以包含通配符或’’|’’,如果多个模式对应同一个命令块,则使用“|”将各个模式分开
- 每个模式必须以右圆括号”)”结束
- 每个命令块必须以双分号(;;)结束,双分号可独占一行,也可放在最后一个命令的后面
- 以esac结尾,表示case语句的结束
注意: 变量或者表达式后面的单词必须为in, 每个表达式或变量的值必须以右括号结束。
case实战案例
1. 做出你的选择
#!/bin/bashread -p \"Please choose yes/no: \" cho ## 通过输入来确定变量case $cho inyes)echo \"Your choose is yes!\" ### 如果你选择yes,就输出你的选择是正确的;; ## 所有结束的地方都是两个分号no)echo \"Your choose is no!\";;*) ### 其他选项用*来表示echo \"Your choose is error!\";;esac
返回执行结果:
[root@ecs-c13b ~]# bash case1.sh Please choose yes/no: yesYour choose is yes![root@ecs-c13b ~]# bash case1.sh Please choose yes/no: noYour choose is no![root@ecs-c13b ~]# bash case1.sh Please choose yes/no: aYour choose is error![root@ecs-c13b ~]#
2. 早饭吃什么
#!/bin/bashprintf \"%-5s %-10s\\n\" 序号 食物printf \"%-5s %-10s\\n\" 1 米饭printf \"%-5s %-10s\\n\" 2 包子printf \"%-5s %-10s\\n\" 3 油条read -p \"请选择你今天要吃什么: \" numexpr $num + 1 &> /dev/null ### 这里+1 判断是不是整数if [ \"$?\" -ne 0 ];then ## $? 加“”,如果不等于零代表是不整数echo \"请输入数字{1|2|3}\"exit 1ficase $num in1) echo \"米饭一碗\";;2) echo \"包子一份\";;3)echo \"油条一份\";;*)echo \"这个有,有吗?那没有\";;esac
执行返回结果:
[root@ecs-c13b ~]# bash case2.sh 序号 食物 1 米饭 2 包子 3 油条 请选择你今天要吃什么: 1米饭一碗[root@ecs-c13b ~]# bash case2.sh 序号 食物 1 米饭 2 包子 3 油条 请选择你今天要吃什么: 2包子一份[root@ecs-c13b ~]# bash case2.sh 序号 食物 1 米饭 2 包子 3 油条 请选择你今天要吃什么: 9这个有,有吗?那没有[root@ecs-c13b ~]#
3. apache服务启动脚本实战
#!/bin/bashcase $1 instart) systemctl $1 httpd ps aux|grep httpd echo \"httpd start\";;stop)systemctl $1 httpd ps aux|grep httpd echo \"httpd stop\";;status)systemctl $1 httpd ;;restart)systemctl $1 httpd echo \"httpd restart\";;*)echo \"USAGE: $0 start|stop|restart\"esac
执行结果:
[root@ecs-c13b ~]# bash case3.sh status● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2020-08-06 08:10:17 CST; 15s ago Docs: man:httpd(8) man:apachectl(8)
总结
case语句是有限的条件,如果条件太多,写起来也麻烦。case语句要结合if条件语句,两者可以改写。 知识case有时候逻辑更清晰一点, if条件语句相对而言显得虚幻。