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用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。
具体要求:
- 只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
- 公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
欢迎使用Jumper-server,请选择你要操作的主机:
1. mysql_server
2. web_server
3. backup_server
4. help
0. exit
- 当用户选择相应主机后,直接免密码登录成功
- 如果用户不输入一直提示用户输入,直到用户选择退出
分析:
- 打印菜单——>定义函数 echo cat
- 让用户选择需要操作的机器 case…esac
- 配置免密登录
- 每个菜单提供功能——>case…esac用户选择做的事情
- 循环让用户输入选择
- 每个功能写成函数——>不是必须
- 脚本放的位置——>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服务器、备份服务器上生成公钥和私钥,并发送给跳板机
- 在跳板机的
yumwei
用户上生成公钥和私钥密钥
# ssh-keygen
- 将跳板机上
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分支语句)