• shell脚本—— case语句+函数



    一、case语句

    case为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配命令

    语法格式

    # 定义变量.var表示变量名
    case var in
    pattern a|b)	#模式1:用 | 分割多个模式,相当于or
    	command1	#需要执行的命令
    	;;	#两个分号表示结束
    pattern 2)
    	command2
    	;;
    pattern 3)
    	command3
    	;;
    		*)	# default,如果前面的条件都不满足,就默认执行 *) 下面的语句
    	commadn4
    	;;
    esac	#esac表示case语句结束
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    示例

    示例1:当给程序传入start、stop、reload三个不同参数时分别执行相应命令

    #!/bin/bash
    case $1 in
            start|S)
            echo "service is run..."
            ;;
            stop|T)
            echo "service is stoped..."
            ;;
            reload|R)
            echo "service is restart..."
            ;;
            *)
            echo "输入错误"
            ;;
    esac
    
    # 测试
    [root@lamp shell]# ./case.sh S
    service is run...
    [root@lamp shell]# ./case.sh stop
    service is stoped...
    [root@lamp shell]# ./case.sh R
    service is restart...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    **示例2:**脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭,重启等

    #!/bin/bash
    read -p "请输入服务的名称:(httpd/mysql) " service
    case $service in
            httpd)
            read -p "请输入对服务进行的操作(start/stop/restart): " operation
            case $operation in
                    stop)
                    systemctl stop httpd
                    ;;
                    start)
                    systemctl start httpd
                    ;;
                    restart)
                    systemctl restart httpd
                    ;;
                    *)
                    echo "输入错误"
                    ;;
            esac
            ;;
            mysql)
            read -p "请输入对服务进行的操作(start/stop/restart): " operation
            case $operation in
                    stop)
                    systemctl stop mysql
                    ;;
                    start)
                    systemctl start mysql
                    ;;
                    restart)
                    systemctl restart mysql
                    ;;
                    *)
                    echo "输入错误"
                    ;;
            esac
            ;;
            *)
            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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    二、函数

    shell中允许将一组命令集合语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能

    函数定义

    函数名()
    {
      函数体(一堆命令的集合,来实现某个功能)   
    }
    
    function 函数名()
    {
       函数体(一堆命令的集合,来实现某个功能)  
    }
    
    
    function_name() {
    		command
    		command
    }
    
    
    function function_name() {
    		command
    		command
    }
    函数中return说明:
    1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
    2.return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间。
    3.如果没有return命令,函数将返回最后一个Shell的退出值。
    
    • 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

    将函数定义到用户的环境变量中

    把函数写入到这些脚本文件中,重启/bin/bash。就可以执行函数了

    /etc/profile	/etc/bashrc		~/.bash_profile	~/.bashrc
    
    • 1
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    
    #测试
    hello()
    {
            echo "hello world!"
            hostname
    }
    
    # 在命令行输入hello
    [root@lamp shell]# vim ~/.bashrc
    [root@lamp shell]# hello
    hello world!
    lamp
    
    
    • 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

    在脚本中调用函数

    #!/bin/bash
    func()
    {
            echo "测试脚本调用函数"
    }
    func
    
    
    [root@lamp shell]# vim case.sh
    [root@lamp shell]# source ./case.sh
    测试脚本调用函数
    [root@lamp shell]# func
    测试脚本调用函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    示例

    示例1:模拟一个多任务维护界面。当执行程序时先显示总菜单,然后进行选择后做相应维护监控操作

    	h	显示命令帮助
    	f	显示磁盘分区
    	d	显示磁盘挂载
    	m	查看内存使用
    	u	查看系统负载
    	q	退出程序
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    脚本编写

    #!/bin/bash
    #定义打印菜单函数
    menu()
    {
    cat <<END
            h 显示命令帮助
            f 显示磁盘分区
            d 显示磁盘挂载
            m 查看内存使用
            u 查看系统负载
            q 退出系统
    END
    }
    menu
    while true
    do
            read -p "请输入对应操作:" input
            #清屏
            clear
            case $input in
                    h)
                    menu
                    ;;
                    f)
                    fdisk -l
                    ;;
                    d)
                    df -h
                    ;;
                    m)
                    free -m
                    ;;
                    u)
                    uptime
                    ;;
                    q)
                    exit
                    ;;
                    *)
                    echo "输入错误"
                    ;;
            esac
            menu
    done
    
    
    • 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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    示例2
    写一个脚本让用户输入基本信息(姓名,性别,年龄),如不输入一直提示输入,最后根据用户的信息输出相对应的内容

    • 循环直到输入字符串不为空 (该功能可以定义为一个函数,方便下面脚本调用)
    • 根据用户输入信息做出匹配判断 case 语句
    
    #!/bin/bash
    name=""
    sex=""
    age=""
    tmp="姓名"
    input=""
    func()
    {
            input=""
            while [ -z $input ]
            do
                    read -p "请输入$tmp:" input
            done
    }
    func
    name=$input
    tmp="性别"
    func
    sex=$input
    tmp="年龄"
    func
    age=$input
    
    echo $name 
    echo $sex 
    echo $age
    
    
    • 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

    综合练习

    现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。

    具体要求:

    1. 只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
    2. 公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
    欢迎使用Jumper-server,请选择你要操作的主机:
    1. mysql_server
    2. web_server
    3. backup_server
    4. help
    0. exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 当用户选择相应主机后,直接免密码登录成功
    2. 如果用户不输入一直提示用户输入,直到用户选择退出

    分析:

    1. 打印菜单——>定义函数 echo cat
    2. 让用户选择需要操作的机器 case…esac
    3. 配置免密登录
    4. 每个菜单提供功能——>case…esac用户选择做的事情
    5. 循环让用户输入选择
    6. 每个功能写成函数——>不是必须
    7. 脚本放的位置——>yunwei用户的家目录

    环境准备

    机器ip身份
    192.168.44.144跳板机
    192.168.44.166数据服务器
    192.168.44.122web服务器
    192.168.44.200备份服务器

    关闭所有机器的防火墙和SELINUX

    # systemctl stop firewalld
    # systemctl disable firewalld
    # setenforce 0
    修改配置文件
    # vim /etc/selinux/config
    SELinux=disabled
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置免密登录

    在数据服务器、web服务器、备份服务器上生成公钥和私钥,并发送给跳板机

    1. 在跳板机的yumwei用户上生成公钥和私钥密钥
    # ssh-keygen
    
    • 1
    1. 将跳板机上yumwei用户生成的公钥发送给其它3台服务器
    # ssh-copy-id root@192.168.44.166
    # ssh-copy-id root@192.168.44.122
    # ssh-copy-id root@192.168.44.200
    
    • 1
    • 2
    • 3

    编写脚本

    #!/bin/bash
    # 跳板机(192.168.44.144)
    
    # 菜单函数
    menu()
    {
            cat <<-EOF
            欢迎使用Jumper_server,请选择你要操作的主机:
            1.nysql_server
            2.web_server
            3.backup_server
            4.help
            0.exit
            EOF
    }
    while true
    do
            #调用菜单打印函数
            clear
            menu
            read -p "请选择你要操作的主机:" server
            case $server in
            1)
            ssh root@192.168.44.166
            ;;
            2)
            ssh root@192.168.44.122
            ;;
            3)
            ssh root@192.168.44.200
            ;;
            4)·
            menu
            ;;
            0)
            exit
            ;;
            *)
            echo "输入错误请重新输入"
            ;;
            esac
    done
    
    • 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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    将这个脚本文件放到跳板机家目录的.bashrc里执行
    注意:.bashrc是启动就支持的脚本文件
    执行命令:echo "bash ~/jumper.sh >> .bashrc"


  • 相关阅读:
    Android 12 正式发布 | 开发者们的全新舞台
    【AGC】目前云调试对于RPK软件包是否支持、素材测试服务如何使用、崩溃服务启用接入异常
    PHP多功能投票微信小程序系统源码
    Yii2 关联查询结果AR对象 如何取到表以外的字段
    基于MWORKS.Sysplorer的油气混合作动筒建模与仿真应用
    老卫带你学---leetcode刷题(215. 数组中的第K个最大元素)
    javascript IP地址正则表达式
    榜样力量激发青少年英语学习新活力
    Java“牵手”淘宝商品评论数据采集+淘宝商品评价接口,淘宝商品追评数据接口,行业商品质检接口,API接口申请指南
    Oracle/PLSQL: BFilename Function
  • 原文地址:https://blog.csdn.net/weixin_53946852/article/details/126450518