第十部分_Shell脚本之函数
2022/4/10 7:12:35
本文主要是介绍第十部分_Shell脚本之函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
函数
1. 什么是函数?
- shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数
- 给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能
2. 如何定义函数?
方法1:
函数名() { 函数体(一堆命令的集合,来实现某个功能) }
方法2:
function 函数名() { #函数体(一堆命令的集合,来实现某个功能) echo hello echo world local sum #定义一个范围只在函数中的变量 }
函数中return说明:
-
函数的返回值就是函数最后一句话执行的状态码
-
return可以结束一个函数。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。
-
return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。
-
如果没有return命令,函数将返回最后一个指令的退出状态值。
例:(这样才会显示出我们真正要的函数的返回值)
注:如果要突破0-256的限制可以这样写:
3. 函数如何调用?
㈠ 当前命令行调用
[root@MissHou shell04]# cat fun1.sh #!/bin/bash hello(){ echo "hello lilei $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF } #传参时用$1、$2等,传数组时用$*、$@等表示取数组中所有数值 [root@MissHou shell04]# source fun1.sh [root@MissHou shell04]# . fun1.sh [root@MissHou shell04]# hello 888 hello lilei 888 MissHou.itcast.cc [root@MissHou shell04]# menu 1. mysql 2. web 3. app 4. exit
㈡ 定义到用户的环境变量中
[root@MissHou shell05] vim ~/.bashrc #文件中增加如下内容: hello(){ echo "hello lilei $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF } #注意: #当用户打开bash的时候会读取该文件
㈢ 脚本中调用
#!/bin/bash #打印菜单 source ./fun1.sh menu(){ cat <<-END h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 END } menu #调用函数 #如果对函数传数字1为第一个参数就在脚本中写成 "menu 1"这种类型 #如果要写成在命令行传参就写成"menu $1"
4. 应用案例
具体需求:
- 写一个脚本收集用户输入的基本信息(姓名,性别,年龄),如不输入一直提示输入
- 最后根据用户的信息输出相对应的内容
思路:
-
交互式定义多个变量来保存用户信息 姓名、性别、年龄
-
如果不输一直提示输入
- 循环直到输入字符串不为空 while 判断输入字符串是否为空
- 每个信息都必须不能为空,该功能可以定义为一个函数,方便下面脚本调用
-
根据用户输入信息做出匹配判断
代码实现:
#!/bin/bash #该函数实现用户如果不输入内容则一直循环直到用户输入为止,并且将用户输入的内容打印出来 input_fun() { input_var="" output_var=$1 while [ -z $input_var ] do read -p "$output_var" input_var done echo $input_var } input_fun 请输入你的姓名: 或者 #!/bin/bash fun() { read -p "$1" var if [ -z $var ];then fun $1 else echo $var fi } #调用函数并且获取用户的姓名、性别、年龄分别赋值给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) xxx ;; *) xxx ;; esac
综合案例
1. 任务背景
现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。
2. 具体要求
- 只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
- 公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit
- 当用户选择相应主机后,直接免密码登录成功
- 如果用户不输入一直提示用户输入,直到用户选择退出
3. 综合分析
- 将脚本放到yunwei用户家目录里的.bashrc文件里(/shell05/jumper-server.sh)
- 将菜单定义为一个函数[打印菜单],方便后面调用
- 用case语句来实现用户的选择【交互式定义变量】
- 当用户选择了某一台服务器后,进一步询问用户需要做的事情 case...esac 交互式定义变量
- 使用循环来实现用户不选择一直让其选择
- 限制用户退出后直接关闭终端 exit
4. 落地实现
#!/bin/bash # jumper-server # 定义菜单打印功能的函数 menu() { cat <<-EOF 欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit EOF } # 屏蔽以下信号 trap '' 1 2 3 19 # 调用函数来打印菜单 menu #循环等待用户选择 while true do # 菜单选择,case...esac语句 read -p "请选择你要访问的主机:" host case $host in 1) ssh root@10.1.1.1 ;; 2) ssh root@10.1.1.2 ;; 3) ssh root@10.1.1.3 ;; h) clear;menu ;; q) exit ;; esac done #将脚本放到yunwei用户家目录里的.bashrc里执行: bash ~/jumper-server.sh exit
进一步完善需求
为了进一步增强跳板机的安全性,工作人员通过跳板机访问生产环境,但是不能在跳板机上停留。
#!/bin/bash #公钥推送成功 trap '' 1 2 3 19 #打印菜单用户选择 menu(){ cat <<-EOF 欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit EOF } #调用函数来打印菜单 menu while true do read -p "请输入你要选择的主机[h for help]:" host #通过case语句来匹配用户所输入的主机 case $host in 1|DB1) ssh root@10.1.1.1 ;; 2|DB2) ssh root@10.1.1.2 ;; 3|web1) ssh root@10.1.1.250 ;; h|help) clear;menu ;; q|quit) exit ;; esac done 自己完善功能: 1. 用户选择主机后,需要事先推送公钥;如何判断公钥是否已推 2. 比如选择web1时,再次提示需要做的操作,比如: clean log 重启服务 kill某个进程
trap--回顾信号:
1) SIGHUP 重新加载配置 2) SIGINT 键盘中断^C 3) SIGQUIT 键盘退出 9) SIGKILL 强制终止 15) SIGTERM 终止(正常结束),缺省信号 18) SIGCONT 继续 19) SIGSTOP 停止 20) SIGTSTP 暂停^Z
这篇关于第十部分_Shell脚本之函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-21《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介
- 2024-12-21后台管理系统开发教程:新手入门全指南
- 2024-12-21后台开发教程:新手入门及实战指南
- 2024-12-21后台综合解决方案教程:新手入门指南
- 2024-12-21接口模块封装教程:新手必备指南
- 2024-12-21请求动作封装教程:新手必看指南
- 2024-12-21RBAC的权限教程:从入门到实践
- 2024-12-21登录鉴权实战:新手入门教程
- 2024-12-21动态权限实战入门指南
- 2024-12-21功能权限实战:新手入门指南