case语句
case结构条件句相当于多分支的if/elif/else条件句,但是它比这些条件句看起来更规范公正,常被用于实现系统服务启动脚本等企业应用场景中。
在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较,如果获取的变量值与某个值(例如值1)匹配,就会执行值(例如值1)的后面对应的指令(例如指令1,可能是一组指令),直到执行到双分号(;;)才停止,然后跳出case语句主体,执行case语句(即esac字符)后面的其他命令
如果没有找到匹配变量的任何值,则执行*)后面的指令(通常是给使用者的使用提示),直到遇到双分号(;;)或者esac结束,这部分相当于if多分支中最后的else语句部分。另外,case语句中的表达式对应值的部分,可以使用管道及通配符等更多功能匹配
1、 case语法
case结构条件句的语法格式为:
case “变量” in
值1)
指令1...
;;
值2)
指令2...
;;
*)
指令3...
esac
如果case语句以中文形式描述,那么就是以下情况:
case “老男孩的各位” in
找到好工作)
给父母买买买
;;
天上掉金子)
给自己买买买
;;
天上掉女朋友)
给女朋友买买买
*)
还是老老实实学习吧!!
esac
2、case结构语句的流程图如下所示:
![](https://img.haomeiwen.com/i16955089/ef143d84f823f04f.png)
3、 案例实操
3.1 编写脚本。使用单个字符进行传参,使用case判断是数字还是字母(使用正则)
[root@shell-project /server/scripts]# cat case-home01.sh
#!/bin/bash
# 使用单个字符进行传参,使用case判断是数字还是字母(使用正则)
read -p "请输入单个字符: " n
case "$n" in
[a-zA-Z])
echo "$n 是字母."
;;
[0-9])
echo "$n 是数字."
;;
*)
echo "其他"
esac
[root@shell-project /server/scripts]#
3.2 将” 打印菜单,按照选择项一键安装不同的web服务”脚本,将其中的条件表达式修改成case或if语句
[root@shell-project /server/scripts]# vim case-home02.sh
1 #!/bin/bash
8 # 将” 打印菜单,按照选择项一键安装不同的web服务”脚本,将其中的条件表达式修改成case或if语句
9
10 #定义变量
11 lamp="/server/scripts/lamp.sh"
12 lnmp="/server/scripts/lnmp.sh"
13
14 #打印菜单
15 cat << EOF
16 1.[install lamp]
17 2.[install lnmp]
18 3.[exit]
19 EOF
20
21 #使用read读取输入
22 read -p 'please input the num you want: ' num
23 #定义函数
24 function lamp_lanp(){
25 if [ -f "$1" ];then
26 if [ ! -x "$1" ];then
27 echo "$1 没有执行权限,不可执行"
28 exit 2
29 else
30 $1
31 fi
32 else
33 echo "error: $1 is not exist."
34 exit 3
35 fi
36 }
37
38 case "$num" in
39 "1")
40 echo 'start installing lamp……'
41 lamp_lanp $lamp
42 ;;
43 "2")
44 echo 'start installing lnmp……'
45 lamp_lanp $lnmp
46 ;;
47 "3")
48 echo 'good byb!'
49 ;;
50 *)
51 echo 'Input Error'
52 exit 5
53 esac
3.3 将Nginx服务管理脚本改为case方式+函数方式,并通过systemctl进行控制启动停止
[root@shelledu ~]# cat /etc/init.d/nginxd_case
#!/bin/bash
#定义函数
function stat_check(){
count=`netstat -lntup|grep nginx|wc -l`
}
function nginx_start(){
stat_check
if [ $count -gt 0 ];then
echo 'nginx已经处于启动状态'
else
/application/nginx/sbin/nginx
echo 'nginx启动成功'
fi
}
function nginx_stop(){
stat_check
if [ $count -eq 0 ];then
echo 'nginx已经处于关闭状态'
else
/application/nginx/sbin/nginx -s stop
echo 'nginx已关闭'
fi
}
# 如果参数是start,则执行start的启动方式(/application/nginx/sbin/nginx)
case "$1" in
"start")
nginx_start
;;
"stop")
nginx_stop
;;
"restart")
nginx_stop
sleep 2
nginx_start
;;
*)
echo '参数错误,正确的参数是{start|stop|restart}'
esac
[root@shelledu ~]#
3.4 使用case选择水果,并打印水果名及其颜色
1.apple
2.pear
3.banana
4.blueberry
其中,颜色表达式分别为
31m 红色
32m 绿色
33m 黄色
34m 蓝色
使用方式为
[root@oldboy-node101 ~]# echo -e "\E[1;31m我是红色 \E[0m"
我是红色
[root@oldboy-node101 ~]# echo -e "\E[1;32m我是绿色 \E[0m"
我是绿色
[root@oldboy-node101 ~]# echo -e "\E[1;33m我是黄色 \E[0m"
我是黄色
[root@oldboy-node101 ~]# echo -e "\E[1;34m我是蓝色 \E[0m"
我是蓝色
分析:
1)打印菜单
2)使用read,显示一句话“选择你喜欢的水果”
3)使用case判断数字是【1|2|3|4】
4)如果都不符合,报错退出
[root@shell-project /server/scripts]# cat case-home02.sh
#!/bin/bash
# 使用case选择水果,并打印水果名及其颜色
#定义函数
function colors(){
echo -e "your like \E[1;${1}m${2} \E[0m"
}
#打印菜单
cat <<EOF
1.apple
2.pear
3.banana
4.blueberry
EOF
read -p "选择你喜欢的水果: " num
case "$num" in
"1")
colors '31' 'apple'
;;
"2")
colors '32' 'pear'
;;
"3")
colors '33' 'banana'
;;
"4")
colors '34' 'blueberry'
;;
*)
echo '抱歉,没有你喜欢的水果!'
esac
[root@shell-project /server/scripts]#
[root@shell-project /server/scripts]# sh case-home02.sh
1.apple
2.pear
3.banana
4.blueberry
选择你喜欢的水果: 1
your like apple
[root@shell-project /server/scripts]#
网友评论