day67-shell编程之-case语句

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结构语句的流程图如下所示:

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]# 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • case结构条件句的语法格式为: case "变量" in 值1) 指令1... ;; 值...
    张鑫泽_2109阅读 234评论 0 0
  • 1、为什么要学习Shell编程? Linux系统中会大量的使用Shell,工作中我们也需要自动化实现业务, 例如:...
    放手吧_e512阅读 281评论 0 0
  • Day28 作者:方维超 归档:课堂笔记 时间:2019/4/9 老男孩教育教学核心思想6重:重目标、重思路、重方...
    Ffvc阅读 294评论 0 1
  • 1、为什么要学习Shell编程? Linux系统中会大量的使用Shell,工作中我们也需要自动化实现业务, 例如:...
    将就灬阅读 169评论 0 0
  • 大早晨的 先是被一张结婚证给晃了眼 接着又被我家男神的小小周 给震撼了一下 汽车上偶遇一喜欢 乖 摸摸头 的男生 ...
    晴天兔子阅读 198评论 0 0