shell脚本—— case语句+函数

Posted 郭怀远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:当给程序传入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.122web服务器
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"


以上是关于shell脚本—— case语句+函数的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Shell脚本中for循环while循环及case分支语句

Shell脚本 for循环 while循环 case分支语句

循环语句和函数

Shell脚本应用(forwhile循环语句和case分支语句)

理论+实操:shell之case语句for/while/until循环语句函数数组-满满的干货

shell脚本应用