【Linux】shell脚本实战-流程控制语句case

举报
互联网老辛 发表于 2021/06/08 23:52:05 2021/06/08
【摘要】 文章目录 前言什么是case语句case语句语法分析case实战案例1. 做出你的选择2. 早饭吃什么3. apache服务启动脚本实战 总结 前言 前面我们探讨过shell脚本中的if语句,单分支,双分支以及多分支的写法,今天我来看另一个流程控制语句case。 什么是case语句 控制语句:用来实现对程序流程的选择、循环、转向和返回等进...

前言

前面我们探讨过shell脚本中的if语句,单分支,双分支以及多分支的写法,今天我来看另一个流程控制语句case。

什么是case语句

控制语句:用来实现对程序流程的选择、循环、转向和返回等进行控制;
case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。

case语句适合用于多分支,多选择的情况,是一个多选选择语句。

case语句语法分析

case 变量名 in 值1) 指令1 ;; 值2) 指令2 ;; 值3) 指令3 ;; *) 指令3 ;; 
esac 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

中文范例,我们喜欢用中文例子来看编程:

case “各位” in 
找到好工作) 给父母买买买 ;;
天上掉金子) 给自己买买买 ;;
天上掉女朋友) 给女朋友买买买
*) 还是老老实实学习吧!!
esac

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

case语句的语法规范**

  • 表达式expr按顺序匹配每个模式,一旦匹配成功,则执行该模式后面的命令块,然后退出case语句
  • 如果没有找到匹配的模式,则执行默认值’’)’‘后的命令块, ‘’)’'可以没有
  • 模式中可以包含通配符或’’|’’,如果多个模式对应同一个命令块,则使用“|”将各个模式分开
  • 每个模式必须以右圆括号”)”结束
  • 每个命令块必须以双分号(;;)结束,双分号可独占一行,也可放在最后一个命令的后面
  • 以esac结尾,表示case语句的结束

注意: 变量或者表达式后面的单词必须为in, 每个表达式或变量的值必须以右括号结束。

case实战案例

1. 做出你的选择
#!/bin/bash
read -p "Please choose yes/no: " cho 
## 通过输入来确定变量
case $cho in yes) echo "Your choose is yes!"   ### 如果你选择yes,就输出你的选择是正确的 ;;  ## 所有结束的地方都是两个分号 no) echo "Your choose is no!" ;; *) ### 其他选项用*来表示 echo "Your choose is error!" ;;
esac

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

返回执行结果:

[root@ecs-c13b ~]# bash case1.sh 
Please choose yes/no: yes
Your choose is yes!
[root@ecs-c13b ~]# bash case1.sh 
Please choose yes/no: no
Your choose is no!
[root@ecs-c13b ~]# bash case1.sh 
Please choose yes/no: a
Your choose is error!
[root@ecs-c13b ~]# 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
2. 早饭吃什么
#!/bin/bash
printf "%-5s %-10s\n" 序号 食物
printf "%-5s %-10s\n" 1 米饭
printf "%-5s %-10s\n" 2 包子
printf "%-5s %-10s\n" 3 油条

read -p "请选择你今天要吃什么: " num
expr $num + 1 &> /dev/null   ### 这里+1 判断是不是整数
if [ "$?" -ne 0 ];then ## $? 加“”,如果不等于零代表是不整数
echo "请输入数字{1|2|3}"

exit 1
fi

case $num in
1) 
echo "米饭一碗"
;;
2) 
echo "包子一份"
;;

3)
echo "油条一份"
;;
*)
echo "这个有,有吗?那没有"
;;
esac

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

执行返回结果:

[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 ~]# 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
3. apache服务启动脚本实战
#!/bin/bash
case $1 in
	start) 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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

执行结果:

[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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

总结

case语句是有限的条件,如果条件太多,写起来也麻烦。case语句要结合if条件语句,两者可以改写。 知识case有时候逻辑更清晰一点, if条件语句相对而言显得虚幻。

文章来源: zmedu.blog.csdn.net,作者:互联网老辛,版权归原作者所有,如需转载,请联系作者。

原文链接:zmedu.blog.csdn.net/article/details/107830098

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。