shell脚本—— case语句+函数

2023-11-06


一、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:当给程序传入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...

**示例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

二、函数

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

函数定义

函数名()
{
  函数体(一堆命令的集合,来实现某个功能)   
}

function 函数名()
{
   函数体(一堆命令的集合,来实现某个功能)  
}


function_name() {
		command
		command
}


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

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

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

/etc/profile	/etc/bashrc		~/.bash_profile	~/.bashrc

# 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

在脚本中调用函数

#!/bin/bash
func()
{
        echo "测试脚本调用函数"
}
func


[root@lamp shell]# vim case.sh
[root@lamp shell]# source ./case.sh
测试脚本调用函数
[root@lamp shell]# func
测试脚本调用函数

示例

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

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

脚本编写

#!/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

示例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

综合练习

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

具体要求:

  1. 只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
  2. 公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
欢迎使用Jumper-server,请选择你要操作的主机:
1. mysql_server
2. web_server
3. backup_server
4. help
0. exit
  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.122 web服务器
192.168.44.200 备份服务器

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

# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
修改配置文件
# vim /etc/selinux/config
SELinux=disabled

配置免密登录

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

  1. 在跳板机的yumwei用户上生成公钥和私钥密钥
# ssh-keygen
  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

编写脚本

#!/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

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本—— case语句+函数 的相关文章

随机推荐

  • html 微信声音自动播放 和 滑动屏幕播放

    html 微信声音自动播放 和 滑动屏幕播放
  • 【Flutter 2-3】Flutter手把手教程UI布局和Widget——容器控件Container

    作者 弗拉德 来源 弗拉德 公众号 fulade me Container 我们先来看一下Container初始化的参数 Container Key key 位置 居左 居右 居中 this alignment EdgeInsets Con
  • C++的std::vector<bool>转储文件

    文章目录 前言 获取数据源地址 MSVC GCC 数据地址获取方法 结果 总结 前言 总所周知 C 的std vector
  • Mac 双系统之windows坏了咋办

    1 背景 Mac mini 装了个双系统 windows 系统太慢 准备重装 本来想着直接恢复出厂 结果根本不能这么操作 由于默认启动盘设置的是windows系统 然后就出现了 起不来的情况 其实之前也遇到过 就是忘了 折腾了好久这里记录一
  • React-router导入Link报错

    按以下导入 出现 Link is not exported from react router 错误 import Router Route Link from react router 解决方案 yarn add react router
  • Python音视频开发:消除抖音短视频Logo的图形化工具实现过程详解

    前往老猿Python博文目录 一 引言 在 Python音视频开发 消除抖音短视频Logo和去电视台标的实现详解 节介绍了怎么通过Python Moviepy OpenCV实现消除视频Logo的四种方法 并提供了详细的实现思路和实现代码 但
  • Kitti Stereo dataset 2015

    发现国内很多人分享kitti目标检测数据集 但少有分享立体匹配数据集的朋友 所以特做此分享 下载链接 2015 https s3 eu central 1 amazonaws com avg kitti data scene flow zi
  • 立创3D导入AD+AD的板子颜色改变

    立创3D导入AD AD的板子颜色改变 文章目录 立创3D导入AD AD的板子颜色改变 介绍 结果图展示 环境情况 3D板子换颜色 3D模型的寻找 3D模型的导入 总结 介绍 AD中默认的绿色板子一点逼格都没有 还缺了很多3D封装 想美化下
  • 提交form表单 报错:POST http://localhost:8080/user/login 404 原因及解决方法

    原因 1 input没有设置name属性 jquery获取不到 更新 文章里边举得例子 稍微有点不恰当 button 千万不要用input标签 要不然servlet就会从它上获取数据 结果还会报错 报这种错误 说明jquery库中的方法 运
  • 前端的对决:React的JSX与Vue的templates

    请点击此处输入图片描述 React js和Vue js是这个星球上最流行的JavaScript库 它们都很强大 相对来说很容易获取和使用 React和Vue的共性 使用虚拟DOM 提供响应式视图组件 专注于开发过程中的一个方面 目前集中在视
  • 因为git忽略大小写而浪费的一天一夜修复bug

    改了多语言文件名 将小写改为大写 vite项目重新发布后 测试环境报找不到这个文件的错误 心路历程分析 1 第一反应是缓存问题 后清除浏览器缓存 vite项目版本号改动 强制清除vite包缓存 使用 force命令 报错 需要再研究一下 都
  • 【刷题笔记】——day.4 路径问题总结

    学习目标 用于记录每日刷的题目为了明年的python组蓝桥杯做准备 今天是打卡的第四天 冲 原题一 不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 问总共有多
  • Windows IntelliJ IDEA 快捷键终极大全

    目录 自动代码 查询快捷键 其他快捷键 调试快捷键 重构 十大Intellij IDEA快捷键 1 智能提示 2 重构 3 代码生成 4 编辑 5 查找打开 6 其他辅助 太难割舍 前三名并列吧 自动代码 常用的有fori sout psv
  • docker部署的mysql容器数据插入中文乱码问题及其衍生问题

    docker部署的mysql容器数据插入中文乱码问题及其衍生问题 前言 笔者使用的mysql时部署在docker容器中的 版本是5 5部分内容参考了https blog csdn net weixin 42168191 article de
  • node.js的文件操作常用命令

    在学习node的时候我们会经常用到一些文件的操作 所以来总结一些常用的文件操作 首先用文件操作之前要导入nodejs的文件模块 const fs require fs 写文件的模块 下面就是nodejs的一些常用文件命令 很详细的注解了 w
  • Web渗透测试---Web TOP 10 漏洞

    文章目录 前言 一 注入漏洞 二 跨站脚本 xss 漏洞 三 文件上传漏洞 四 文件包含漏洞 五 命令执行漏洞 六 代码执行漏洞 七 XML外部实体 XXE 漏洞 八 反序列化漏洞 九 SSRF漏洞 十 解析漏洞 前言 常见的漏洞有注入漏洞
  • 蓝桥杯-第九届决赛——版本分支

    标题 版本分支 小明负责维护公司一个奇怪的项目 这个项目的代码一直在不断分支 branch 但是从未发生过合并 merge 现在这个项目的代码一共有N个版本 编号1 N 其中1号版本是最初的版本 除了1号版本之外 其他版本的代码都恰好有一个
  • 边界类、控制类、实体类

    UML中类有三种主要的版型 边界类 控制类和实体类 引入边界类 控制类及实体类的概念有助于分析和设计人员确定系统中的类 边界类位于系统与外界的交界处 窗体 报表 以及表示通讯协议的类 直接与外部设备交互的类 直接与外部系统交互的类等都是边界
  • 从MSVC习惯到QTCreator工程pro文件实用介绍

    对于用惯VS的各位 一定想QT Creator也能用的那么溜 其实关键在 pro 从MSVC习惯到QTCreator工程pro文件实用介绍 首先建立一个相当于sln的工程文件 TEMPLATE subdirs SUBDIRS raknet
  • shell脚本—— case语句+函数

    文章目录 一 case语句 语法格式 示例 二 函数 函数定义 将函数定义到用户的环境变量中 在脚本中调用函数 示例 综合练习 环境准备 配置免密登录 编写脚本 一 case语句 case为多选择语句 可以用case语句匹配一个值与一个模式