前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >shell脚本中的case条件语句介绍和使用案例

shell脚本中的case条件语句介绍和使用案例

作者头像
老油条IT记
发布于 2020-04-08 09:24:33
发布于 2020-04-08 09:24:33
6.4K00
代码可运行
举报
运行总次数:0
代码可运行

#前言:这篇我们接着写shell的另外一个条件语句case,上篇讲解了if条件语句。case条件语句我们常用于实现系统服务启动脚本等场景,case条件语句也相当于if条件语句多分支结构,多个选择,case看起来更规范和易读

#case条件语句的语法格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case "变量" in1)
        指令1...
    ;;2)
        指令2...
    ;;
    *)
        指令3...
esac

#说明:当变量的值等于1时,那么就会相应的执行指令1的相关命令输出,值等于2时就执行指令2的命令,以此类推,如果都不符合的话,则执行*后面的指令,要注意内容的缩进距离

#简单记忆

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case "找工作条件" in
    给的钱多)
        给你工作...
    ;;
    给股份)
        给你工作...
    ;;
    有发展前景)
        可以试试...
    ;;
    *)
        bye bye !!
esac

#实践使用

实践1.根据用户的输入判断用户输入的是哪个数字,执行相应动作

#如果用户输入的是1-9的任意一个数字,则输出对应输入的数字,如果是别的字符,则提示输出不正确并退出程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell scripts]# cat num.sh 
#!/bin/bash

#create by guoke
#function number input

read -p "please input a number:" num  #打印信息提示用户输入,输入信息赋值给num变量

case "$num" in
    1)
        echo "The num you input is 1"
    ;;
    [2-5])
      echo "The num you input is 2-5"
    ;;
    [6-9])
      echo "The num you input is 6-9"
    ;;
    *)
      echo "please input number[1-9] int"
      exit;
esac

#说明:使用read读取用户输入的数据,然后使用case条件语句进行判断,根据用户输入的值执行相关的操作

#执行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell scripts]# sh num.sh 
please input a number:1
The num you input is 1
[root@shell scripts]# sh num.sh 
please input a number:3
The num you input is 2-5
[root@shell scripts]# sh num.sh 
please input a number:4
The num you input is 2-5
[root@shell scripts]# sh num.sh 
please input a number:8
The num you input is 6-9
[root@shell scripts]# sh num.sh
please input a number:a
please input number[1-9] int

实践2.打印一个如下的水果菜单

(1) banana

(2) apple

(3) orange

(4) cherry

#脚本编写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell scripts]# cat menu.sh 
#!/bin/bash

#create by guoke
#function print menu

RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'

echo ' #使用echo打印菜单
#############################
    1.banana
    2.apple
    3.pear
    4.cherry
#############################
'

read -p "please select a num:" num

case "$num" in
    1)
      echo -e "${YELLOW_COLOR} banana ${RES}"
    ;;
    2)
      echo -e "${RED_COLOR} apple ${RES}"
    ;;
    3)
      echo -e "${GREEN_COLOR} pear ${RES}"
    ;;
    4)
      echo -e "${BLUE_COLOR} cherry ${RES}"
    ;;
    *)
      echo "please input {1|2|3|4}"
esac

#说明:定义颜色,使用read读取用户输入的数据,然后使用case条件语句进行判断,根据用户输入的值执行相关的操作,给用户输入的水果添加颜色

#扩展:输出菜单的另外种方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat<<-EOF
===============================
    1.banana
    2.apple
    3.pear
    4.cherry
===============================
EOF

#执行效果

#如果输入不正确或者不输入的话就打印帮助

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell scripts]# sh menu.sh 

#############################
    1.banana
    2.apple
    3.pear
    4.cherry
#############################

please select a num:
please input {1|2|3|4}

#输入选项中的数字,打印相关信息

实践3.开发nginx启动脚本

#主要思路:

#1.主要通过判断nginx的pid文件有无存在,通过返回值查看有没有运行

#2.通过case语句获取参数进行判断

#3.引入系统函数库functions中的action函数

#4.对函数及命令运行的返回值进行处理

#5.设置开机自启动

#附上nginx编译安装过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
yum install  gcc  pcre pcre-devel wget openssl  openssl-devel.x86_64  -y  
mkdir -p /home/demo/tools
cd /home/demo/tools/
wget  -q http://nginx.org/download/nginx-1.6.3.tar.gz
useradd  nginx -s /sbin/nologin -M
tar  xf nginx-1.6.3.tar.gz 
cd nginx-1.6.3/
./configure  --user=nginx --group=nginx   --prefix=/application/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install
ln -s /application/nginx-1.6.3 /application/nginx/  #做软连接
/application/nginx/sbin/nginx  -t   #检查语法
/application/nginx/sbin/nginx       #启动服务

#脚本编写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell init.d]# chmod +x /etc/init.d/nginxd
[root@shell init.d]# cat nginxd 
#!/bin/bash
#chkconfig: 2345 40 98   #设定2345级别,开机第40位启动脚本,关机第98位关闭脚本

#create by guoke
#email:1075792988@qq.com
#function nginx start scripts

[ -f /etc/init.d/functions ] && source /etc/init.d/functions  #引入系统函数库

PIDFILE=/application/nginx/logs/nginx.pid  #定义PID文件路径
NGINX=/application/nginx/sbin/nginx  #定义启动命令路径

value(){  #定义返回值函数
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
      action "Nginx is $1" /bin/true
    else
      action "Nginx is $1" /bin/true
    fi
}

start(){ #定义启动函数
    if [ -f $PIDFILE ];then  #判断PIDFILE存不存在,存在就打印运行,否则就启动
      echo "Nginx is running"
    else
      $NGINX
      value start #调用返回值函数
    fi
}

stop(){ #定义停止函数
    if [ ! -f $PIDFILE ];then #也是通过判断PID文件是否存在然后进行相关操作
      echo "Nginx not running"
    else
      $NGINX -s stop
      value stop
    fi
}

reload(){ #定义重启函数
    if [ ! -f $PIDFILE ];then
      echo "not open $PIDFILE no such directory"
    else
      $nginx -s reload
      value reload
    fi
}

case "$1" in  #使用case接收脚本传参的字符串
    start)  #如果第一个参数为start,调用start函数
      start
    ;;
    stop)   #如果第一个参数为stop,调用stop函数
      stop
    ;;
    reload)
      stop
      sleep 1
      start
    ;;
    *)
      echo "USAGE:$0 {stop|start|reload}"
      exit 1
esac

#执行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell init.d]# sh nginx stop
Nginx is stop                                              [  OK  ]
[root@shell init.d]# sh nginx start
Nginx is start                                             [  OK  ]
[root@shell init.d]# sh nginx reload
Nginx is stop                                              [  OK  ]
Nginx is start                                             [  OK  ]

实践4.开发跳板机

#要求用户登录到跳板机后只能执行管理员给定的选项动作,不能中断脚本而到跳板机服务器上执行任何系统命令

#思路

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.首先做好ssh key验证登录
2.实现远程连接菜单选择脚本
3.利用Linux信号防止用户在跳板机上操作
4.用户登录后就调用脚本

#操作过程

3.1.做ssh免密钥登录,发送到各个主机,如果机器多的话可以使用脚本进行循环发送

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[demo@shell ~]$ ssh-keygen  -t dsa -P "" -f ~/.ssh/id_dsa  
Generating public/private dsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_dsa): 
Created directory '/home/demo/.ssh'.
Your identification has been saved in /home/demo/.ssh/id_dsa.
Your public key has been saved in /home/demo/.ssh/id_dsa.pub.
The key fingerprint is:
SHA256:BTFfcC2hMKBzuZeUYylC3qgza7z4X6j3RBlwq8Beoak demo@shell
The key's randomart image is:
+---[DSA 1024]----+
|    + o.*...+o   |
| . = B o O +. .  |
|  = B B * +  .   |
| o + = B +       |
|E = . + S        |
| . + o .         |
|  + . o          |
| o o.o           |
|..+o...          |
+----[SHA256]-----+
#命令说明:一键生成密钥,不用按回车。-t:指定要创建的密钥类型,-P:提供旧密码,空表示不需要密码,-f:指定位置

#将公钥拷贝到其他服务器的demo用户
[demo@shell ~]$ ssh-copy-id -i .ssh/id_dsa.pub "demo@192.168.86.129"
[demo@shell ~]$ ssh-copy-id -i .ssh/id_dsa.pub "demo@192.168.86.130"
[demo@shell ~]$ ssh-copy-id -i .ssh/id_dsa.pub "demo@192.168.86.131"

#3.2.编写脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell scripts]# cat tiaobanji.sh 
#!/bin/bash

trapper(){  #定义屏蔽信号函数
    trap  '' INT QUIT TSTP TERM HUB
}

menu(){ #定义菜单列表函数
    cat<<-EOF #加-后面的EOF就可以不用顶格
==============Host List==============
    1) 192.168.86.129
    2) 192.168.86.130
    3) 192.168.86.131
    4) 192.168.86.132
    5) exit
=====================================
    EOF
}

USER=demo

host(){ #定义主机列表函数
    case "$1" in
    1)
        ssh $USER@192.168.86.129
    ;;
    2)
        ssh $USER@192.168.86.130
    ;;
    3)
        ssh $USER@192.168.86.131
    ;;
    4)
        ssh $USER@192.168.86.132
    ;;
    5)
        exit
esac
}

main(){ #定义主函数
    while : #while循环,一直循环
    do
        trapper #调用trapper函数
        clear  #清屏
        menu #调用菜单函数
        read -p "please select a num:" num #获取用户输入
        host $num #调用主机列表函数和传入的参数,进行远程登录
    done
}
main #调用主函数

#3.3.编写脚本进行判断,判断是否是root用户登录,如果不是root用户就执行脚本,弹出跳板机界面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@shell ~]# cd /etc/profile.d/
[root@shell profile.d]# cat jump.sh 
#!/bin/bash

[ $UID -ne 0 ] && . /scripts/tiaobanji.sh

#3.4.测试

#登录demo普通用户输入密码的时候就会直接跳到选项卡页面了

#选项卡页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
==============Host List==============
1) 192.168.86.129
2) 192.168.86.130
3) 192.168.86.131
4) 192.168.86.132
5) exit
=====================================
please select a num:1  #进行选择
Last login: Tue Mar 31 23:48:33 2020 from 192.168.86.128
[demo@mysql ~]$ 

#3.5.提示:跳板机的安全

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.禁止跳板机可以从外网IP进行登录,只能从内网IP登录
2.其他服务器也限制只能内网IP登录,同时禁止root登录,做完ssh key认证,将密码登录禁止,通过免密码登录到其他服务器

#总结:if条件语句主要用于取值判断、比较,应用比较广,case条件语句主要是写服务的启动脚本,各有各的优势。好了,shell脚本的条件语句就讲解到这里了,接下来会继续写shell脚本的循环(包括for,while等),如果写的不好的地方还望指出,多多交流提高,下次再会。。。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Spring AOP 实现 原
AOP(Aspect Orient Programming),我们一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务、日志、缓存、分布式锁等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。Spring的主要动态代理有CGLib和JDK自动代理。
chinotan
2019/04/03
4390
Spring AOP 实现
                                                                            原
Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式
下面这篇文章讲过spring的标签解析过程,aop:aspectj-autoproxy严格来说属于自定义标签, spring默认和自定义标签的解析过程
大忽悠爱学习
2022/05/10
6650
Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式
从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】
本文标题包含有'靓丽'的字眼:Spring框架bug。相信有的小伙伴心里小九九就会说了:又是一篇标题党文章。 鉴于此,此处可以很负责任的对大伙说:本人所有文章绝不哗众取宠,除了干货只剩干货。
YourBatman
2019/09/03
16K5
跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
猫头虎博主在此!👋 大家好,我是一只始终对技术保持着无限热爱的猫头虎。今天,我将带大家深入探讨在Java和Go语言中的方法增强技术。你是否在搜索如何在类内部调用另一个有注解的方法?🔍 或是怎样在Go中通过不同的设计模式来实现方法的增强呢?不必再苦恼,这篇博文将为你提供一站式的解决方案!拿起你的☕️,一起来学习吧!
猫头虎
2024/04/09
1230
跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
详细整理Spring事务失效的具体场景及解决方案
实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制;好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Spring事务失效的场景,希望开发过程尽量避免踩坑,造成时间精力的浪费。 溪源按照最基本的使用方式以及常见失效场景优先级整理,先简单介绍一下具体失效场景:
沁溪源
2020/09/02
1.2K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
Java团长
2019/12/25
3.3K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
SpringAop源码分析(基于注解)一
关于Aop的原理,简单来讲无非就是用代理模式为目标对象生产代理对象,对原有的方法进行增强。看上去挺简单,但在Spring中,有许多细节是要注意到的。比如:
周同学
2019/10/24
4910
Spring AOP注解为什么失效?90%Java程序员不知道
使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效。 如下面几种场景 1、Controller直接调用Service B方法:Controller > Service A 在Service A 上加@Transactional的时候可以正常实现AOP功能。 2、Controller调用Service A方法,A再调用B方法:Controller > Service A > Service B 在Service
Java技术栈
2018/03/30
1.4K0
完整剖析SpringAOP的自调用
spring全家桶帮助java web开发者节省了很多开发量,提升了效率。但是因为屏蔽了很多细节,导致很多开发者只知其然,不知其所以然,本文就是分析下使用spring的一些注解,不能够自调用的问题。因为本身这类文章很多,所以有些地方不会详述,直接引用其他文章。
方丈的寺院
2019/09/18
7270
完整剖析SpringAOP的自调用
事务没回滚?来,我们从现象到原理一起分析一波!
需求是有两个表,分别是订单表和订单附加信息表,其中订单表一定要落数据,订单附加信息表保存的时候如果有异常,则回滚,但是不能影响订单表的数据。
why技术
2019/09/18
6160
事务没回滚?来,我们从现象到原理一起分析一波!
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring在程序运行期,就能帮助我们把切面中的代码织入Bean的方法内,让开发者能无感知地在容器对象方法前后随心添加相应处理逻辑,所以AOP其实就是个代理模式。 但凡是代理,由于代码不可直接阅读,也是初级程序员们 bug 的重灾区。
JavaEdge
2021/12/07
4850
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring Aop标签解析原理详解
对于Spring Aop的实现,是非常复杂的,其实现过程主要包含xml标签的解析,切面表达式的解析,判断bean是否需要应用切面逻辑,以及使用Jdk代理或者是Cglib代理生成代理类,本文主要讲解Xml标签的解析的实现原理。
JavaQ
2019/05/30
5430
(六)Spring源码解析:Spring AOP源码解析
当我们对某些类有横切性的逻辑时,为了不破坏目标类,我们则可以使用AOP的方式将增强逻辑注入到目标类上。为了更清晰的了解AOP的用法,下面我们通过一个使用案例,实现一下面向切面编程。
爪哇缪斯
2023/09/06
7810
(六)Spring源码解析:Spring AOP源码解析
@Transactional 你真的用对了吗?
某天我在做自己的需求时,发现有一个同事写的老接口(Ps:此处真的是我有一个同事😶)里的一行代码IDE有个警告提示,本来也没在意,以为就是个格式检查,但是瞄了一眼,发现不对劲,提示的是:
别惹CC
2025/01/14
1730
SpringBoot - 优雅的处理【长事务】
在Spring体系中,在方法上加上注解@Transactional,Spring自动帮我们进行事务的开启、提交、回滚操作,真的是太方便了,以至于不分青红皂白,啥都搞上…
小小工匠
2022/03/10
2.1K0
SpringBoot - 优雅的处理【长事务】
Spring源码之AOP的使用
我们都知道 Java 是一门面向对象(OOP)的语言,所谓万物皆对象。但是它也存在着一些个弊端:当你需要给多个不具有继承关系的对象引入同一个公共的行为的时候,例如日志,安全检测等等,我们只能在每个对象中去引入这个公共行为,这样就产生了大量的重复代码,并且耦合度也会很高,不利于维护。正因如此就产生了面向切面(AOP)编程。可以说有了 AOP 使得面向对象更加完善,是对其的一个补充,AOP 所关注的方式是横向的,不同于 OOP 的纵向,接下来我们详细讲解一下 spring 中的 AOP。
@派大星
2023/06/28
1600
Spring源码之AOP的使用
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
曾高飞
2022/08/15
2.6K0
基于注解的SpringAOP源码解析(一)
本文会分析Spring的AOP模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,demo工程我以备好,需要的童鞋自行在下方链接下载:
Java学习录
2019/08/19
5680
@Transactional 自调用失效问题解析
”脏脏包“在技术群里问了一个问题:”大家有在项目中遇到这样的场景吗 在一个service层重写的方法中调用一个私有方法。 service重写的方法不加事务 私有方法想加入事务 他去调用私有方法时 私有方法需要被事务控制“ 。
明明如月学长
2021/08/31
1.2K0
@Transactional 自调用失效问题解析
aop:aspectj-autoproxy
因为AopDemo实现了AopDemoInter接口,但做实验的send方法又不在此接口里定义,所以只能用cglib的方式代理。
MickyInvQ
2021/10/18
8260
推荐阅读
相关推荐
Spring AOP 实现 原
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档