AI智能
改变未来

11.Shell之CASE语句+函数

小破站学习笔记

case语句

多重匹配语句。
匹配成功,执行相对匹配命令

  • 语法结构
case var in 	#var 变量名patter 1) 		#模式1command1 	#需要执行的命令;; 			#2个分号表示命令结束patter 2)command2;;patter 3)command3;;*) 		#default 不满足上面的模式的时候 默认执行*)下面的语句command4;;esac			#esac表示case语句的结束

应用案例

– 脚本传不同的值做不同的事
需求:当给程序传入start stop reload 三个不同参数 执行不同命令

#!/bin/bashcase $1 instart|S)service apache start &>/dev/null && echo \"apache 启动成功\";;stop|T)service apache stop &>/dev/null echo && \"apache 停止成功\";;reload|R)service apache reload &>/dev/null echo && \"apache 重启成功\"*)echo \"请输入要做的事情\";;esac

– 根据用户需求选择做事

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

#!/bin/bashread -p \"请输入需要管理的服务名称(vsftod):\" servicecase $service invsftpd|ftp)read -p \"请输入要做什么操作:\" actioncase $action instart|S)service vsftpd start &>/dev/null && echo \"apache 启动成功\";;stop|P)service vsftpd stop &>/dev/null echo && \"apache 停止成功\";;reload|restart|R)service vsftpd reload &>/dev/null echo && \"apache 重启成功\";;#*) 也可以不写esac;;httpd)echo \"apache is running...\";;*)echo \"请输入需要管理的服务名称(vsftod):\";;esac

– 菜单提示让用户选择要做的事
模拟一个多任务维护界面;当执行程序时先显示总菜单,然后进行相应维护监控操作

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

思路:
1.打印菜单
2.交互式让用户输入操作编号,然后做对应处理

su - zss <<ENDtouch 11.2END
#!/bin/bash#菜单打印cat <<-ENDh 显示命令帮助f 显示磁盘分区d 显示磁盘挂载m 查看内存使用u 查看系统负载q 退出程序END#用户选择需要维护的内容while truedoread -p \"请选择需要操作的内容(help|h)\" actionclearcat <<-ENDh 显示命令帮助f 显示磁盘分区d 显示磁盘挂载m 查看内存使用u 查看系统负载q 退出程序ENDcase $action inh|help)cat <<-ENDh 显示命令帮助f 显示磁盘分区d 显示磁盘挂载m 查看内存使用u 查看系统负载q 退出程序END;;f)lsblk;;d)df -h;;m)free -m;;u)uptime;;q)exit;;esacdone

函数

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

– 如何定义函数

方法1函数名(){函数体(一堆命令的集合,实现某个功能)}方法2function 函数名(){函数体(一堆命令的集合,实现某个功能)}
#!/bin/bashhello(){echo \"hello world\"}function world(){rm -rf /tmp/*touch /tmp/file{1..2}}######假设上面的脚本名是1.sh#source 1.sh#hello#可以在命令行直接这样用

新姿势

  • 函数中return说明:
function 函数名(){函数体(一堆命令的集合,实现某个功能)echo hello#return 	#1.直接结束循环echo worldreturn 10 	#2.自定义设置返回值 可以用于后面进行判断}

1.

return

可以结束一个函数。类似于循环控制语句的

break

(结束当前循环,执行循环体后面的内容)
2.

return

默认返回函数中最后一条命令状态值,也可以给定参数值,范围是

0-256

之间
3.如果没有

return

命令,函数将返回最后一个指令的退出状态值

  • 函数如何调用
  • 当前命令行调用
#!/bin/bashhello(){echo \"$1\"}function world(){rm -rf /tmp/*touch /tmp/file{1..2}}######假设上面的脚本名是1.sh#source 1.sh#world                  #可以直接用#hello 8888  			#传入参数#可以在命令行直接这样用#source 完直接用函数名
  • 定义到用户的环境变量里去
vim ~/.bashrc#文件增加以下内容hello(){echo \"$1\"}
  • 脚本中调用函数
#!/bin/bashhello(){echo \"$1\"}while truedohello zssdone#函数名加参数 脚本里直接调用 同时也可以写到别的循环体#这里都是临时调用

应用案例

  • 收集用户输入的信息

需求:写一个脚本收集用户输入的基本信息,不输入一直提示输入 最后根据用户的信息输出相对内容
思路:交互式定义多个变量来保存用户信息
如果不输入一直提示输入

#!/bin/bash#实现用户如果不输入内容一直循环到输出内容为止input_fun(){input_var=\"\"output_var=$1while [ -z $input_var];doread -p \"output_var\"  input_vardoneecho $input_var}#name=`input_fun 请输入如你的名字:`#sex=`input_fun 请输入如你的性别:`#age=`input_fun 请输入如你的年龄:`#echo $name#echo $sex#echo $age###################或者#!/bin/bashfun(){read -p \"$1\" nameif [ -z $name ];thenfun $1elseecho $namefi}#############调用函数并获取用户的姓名性别年龄 分别赋值给name sex agename=$(input_fun 请输入如你的名字:)sex=$(input_fun 请输入如你的性别:)age=$(input_fun 请输入如你的年龄:)#根据用户输入的行呗进行匹配判断case $sex inman)if [ $age -gt 18 -a $age -le 35 ];thenecho \"中年大叔\"elif [ $age -gt 35 ];thenecho \"保温杯里泡枸杞\"elseecho \"年轻有为\"fi;;woman)echo \"小姐姐\";;*)xx;;esac
  • 做安全策略限制用户权限
    需求:只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
    公司运维人员远程通过yunwei用户连接跳板机时,跳出下面菜单

1.脚本要放到yunwei用户的家目录的.bashrc文件里
2.菜单定义为一个函数方便后面调用
3.case 语句实现用户的选择 【交互式定义变量】
4.当用户选择了某一台服务器后,进一步询问用户需要做什么
5.使用循环实现用户不选择一直让其选择
6.限制用户 退出后直接关闭终端 不让其有别的操作

#!/bin/bash#屏蔽手动退出信号 ctrl c z 防止手动退出回到操作界面trap \'\' 1 2 3 19# 打印菜单menu(){cat <<EOF欢迎使用Jumper-server,请选择你要操作的主机:1.db12.db23.web14.web2h.helpq.exitEOF}menu#调用函数打印菜单#循环等待用户选择while truedo#菜单选择 case..esac语句read -p \"请选择你要访问的主机:\" hostcase $host in1)ssh [email protected];;2)ssh [email protected];;3)ssh [email protected];;4)ssh [email protected])clear;menu;;q)exit;;

回顾信号:

1 重新加载配置2 键盘中断^c3 键盘退出9 强制终止15 终止 正常结束 缺省信号18 继续19 停止20 暂停^z

总结

脚本重要是思路功能拆分用到什么命令优化
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 11.Shell之CASE语句+函数