shell之case语句与函数
目录
一、case语句
1.1 语法结构
case var in 定义变量;var代表是变量名
pattern 1) 模式1;用 | 分割多个模式,相当于or
command1 需要执行的语句
;; 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) default,不满足以上模式,默认执行*)下面的语句
command4
;;
esac esac表示case语句结束
#pattern表示需要匹配的模式
1.2 应用案例
1)脚本传不同值做不同事
① 需求:
当给程序传入start、stop、restart三个不同参数时分别执行相应命令!
② 实现:
#!/bin/bash
case $1 in
start|S)
service httpd start &> /dev/null && echo "httpd 启动成功"
;;
stop|T)
service httpd stop &> /dev/null && echo "httpd 停止成功"
;;
restart|R)
service httpd restart &> /dev/null && echo "httpd 重启成功"
;;
*)
echo "请输入对应的值(start|stop|restart)……"
;;
esac
2)根据用户需求选择做事
① 需求:
脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作!
② 实现:
#!/bin/bash
read -p "请输入你需要管理的服务名称(httpd|vsftpd):" service
case $service in
vsftpd|ftp)
read -p "请选择需要执行的指令(start|stop|restart):" action1
case $action1 in
start)
service vsftpd start &> /dev/null && echo "${service}服务已经启动成功"
;;
stop)
service vsftpd stop &> /dev/null && echo "${service}服务已经停止成功"
;;
restart)
service vsftpd restart &> /dev/null && echo "${service}服务已经重启成功"
;;
esac
;;
httpd|apache)
read -p "请选择需要执行的指令(start|stop|restart):" action2
case $action2 in
start)
service httpd start &> /dev/null && echo "${service}服务已经启动成功"
;;
stop)
service httpd stop &> /dev/null && echo "${service}服务已经停止成功"
;;
restart)
service httpd restart &> /dev/null && echo "${service}服务已经重启成功"
;;
esac
;;
esac
3)菜单提示让用户选择需要做的事
① 需求:
模拟一个多任务维护界面,当执行程序时先显示总菜单,然后进行选择后做相应的操作!如下:
**********请选择*********
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
*************************
② 实现:
#!/bin/bash
#打印菜单
menu(){
cat <<END
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
END
}
menu
while true
do
read -p "请输入你的操作[h for help]:" var1
case $var1 in
h)
menu
;;
f)
read -p "请输入你要查看的设备名字[/dev/sdb]:" var2
case $var2 in
/dev/sda)
fdisk -l /dev/sda
;;
/dev/sdb)
fdisk -l /dev/sdb
;;
esac
;;
d)
lsblk
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
esac
done
二、函数
2.1 函数简介
- shell中允许将一组命令集合或语句形成一段可用代码,这些代码成为shell函数;
- 给这段代码起个名称成为函数名,后续可以直接调用这段代码的功能;
2.2 定义函数
1)方法一
函数名()
{
函数体(一堆命令的集合,来实现某个功能)
}
2)方法二
function 函数名()
{
函数体(一堆命令的集合,来实现某个功能)
echo hello
echo world
}
函数中return说明:
1)return可以结束一个函数。类似于循环控制语句break结束当前循环。执行循环体后的代码;
2)return默认返回函数中最后一个命令状态值,也可给定参数值,范围是0~256之间;
3)如果没有return命令,函数将返回最后一个指定的退出状态值;
2.3 调用函数
1)当前命令行调用
$ vim 1.sh
#!/bin/bash
hello(){
echo “hello lzj $1”
hostname
}
menu(){
cat <<-EOF
1.mysql
2.web
3.app
4.exit
EOF
}
$ source 1.sh
$ hello 888
“hello lzj 888”
localhost.localdomain
$ menu
1.mysql
2.web
3.app
4.exit
2)定义到用户的环境变量中
$ vim ~/.bashrc
文件中增加如下内容:
hello(){
echo "hello lzj $1"
hostname
}
menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}
注意:当用户打开bash的时候会读取该文件
3)脚本中调用
$ vim 2.sh
#!/bin/bash
#打印菜单
source ./1.sh
menu(){
cat <<-EOF
h 显示帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
EOF
}
menu
$ sh 2.sh
h 显示帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
4)应用示例
① 需求:
1)写一个脚本收集用户输入的基本信息(姓名、性别、年龄)。如果不输入,一直提示输入;
2)最后根据用户的信息输出相对应的内容;
② 实现:
#!/bin/bash
#该函数实现用户如果不输入内容则一直循环知道用户输入位置,并且将用户输入的内容打印出来
input_fun(){
input_var=""
output_var=$1
while [ -z $input_var ]
do
read -p "$output_var" input_var
done
echo $input_var
}
#调用函数并且获取用户的姓名、性别、年龄分别负责赋值给name、sex、age
name=$(input_fun 请输入您的姓名:)
sex=$(input_fun 请输入您的性别:)
age=$(input_fun 请输入您的年龄:)
#根据用户输入的性别进行匹配判断
case $sex in
man)
if [ $age -gt 18 -a $age -le 35 ];then
echo "年轻有为!加油"
elif [ $age -gt 35 ];then
echo "有点老了"
else
echo "太小了!"
fi
;;
woman)
echo "小姐姐"
;;
esac
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************