云计算之Shell编程 函数教程

举报
tea_year 发表于 2024/08/28 01:18:47 2024/08/28
【摘要】 函数shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。2.1 函数定义 函数名() { 函数体(一堆命令的集合,来实现某个功能) } ​ function 函数名() { 函数体(一堆命令的集合,来实现某个功能) } ​ ​ function_name() { ...

函数

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

2.1 函数定义

 函数名()
 {
   函数体(一堆命令的集合,来实现某个功能)   
 }
 ​
 function 函数名()
 {
    函数体(一堆命令的集合,来实现某个功能)  
 }
 ​
 ​
 function_name() {
         command
         command
 }
 ​
 ​
 function function_name() {
         command
         command
 }
 ​
 ​
 函数中return说明:
 1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
 2.return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间。
 3.如果没有return命令,函数将返回最后一个Shell的退出值。

2.2 函数的调用

  • 当前命令行调用

 [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
 }
 ​
 [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
 ​
 ​
  • 定义到用户的环境变量中

 ​
 /etc/profile    /etc/bashrc     ~/.bash_profile ~/.bashrc
 ​
 [root@MissHou shell04]# cat ~/.bashrc 
 # .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 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        //调用函数
 ​

2.3 应用案例

需求:写一个脚本让用户输入基本信息(姓名,性别,年龄),如不输入一直提示输入,最后根据用户的信息输出相对应的内容

思路:

  • 循环直到输入字符串不为空 (该功能可以定义为一个函数,方便下面脚本调用)

  • 根据用户输入信息做出匹配判断 case 语句

 #!/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" name
 if [ -z $name ];then
 fun $1
 else
 echo $name
 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
 ​
     
     
 描述以下代码含义:   
 :()
 {
    :|:&
 }
 :
 ​
 :(){:|:&}:


三、综合案例

任务/背景:

现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。

具体要求:

  1. 只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作

  2. 公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:

 欢迎使用Jumper-server,请选择你要操作的主机:
 1. DB1-Master
 2. DB2-Slave
 3. Web1
 4. Web2
 h. help
 q. exit
  1. 当用户选择相应主机后,直接免密码登录成功

  2. 如果用户不输入一直提示用户输入,直到用户选择退出

分析:

  1. 打印菜单——>定义函数 echo cat

  2. 让用户选择需要操作的机器 case....esac

  3. 配置免密登录

  4. 每个菜单提供功能——>case...esac用户选择做的事情

  5. 循环让用户输入选择

  6. 每个功能写成函数——>不是必须

  7. 脚本放的位置——>yunwei用户的家目录

 #!/bin/bash
 # jumper-server
 # 定义菜单打印功能的函数
 menu()
 {
 cat <<-EOF
 欢迎使用Jumper-server,请选择你要操作的主机:
 1. DB1-Master
 2. DB2-Slave
 3. Web1
 4. Web2
 h. help
 q. exit
     EOF
 }
 ​
 while true
 do
 # 调用函数来打印菜单
 clear
 menu
 # 菜单选择,case...esac语句
 read -p "请选择你要访问的主机:" host
 case $host in
     1)
     ssh root@10.1.1.2
     ;;
     2)
     ssh root@10.1.1.3
     ;;
     3)
     ssh root@10.1.1.2
     ;;
     h)
     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
 ​
 ​
 #!/bin/bash
 #jumper-server
 #菜单打印
 trap '' 1 2 3 
 while true
 do
 cat <<-END
 欢迎使用Jumper-server,请选择你要操作的主机:
 1. DB1-Master
 2. DB2-Slave
 3. Web1
 4. Web2
 5. exit
 END
 #让用户选择相应的操作
 read -p "请输入你要操作的主机:" host
 case $host in
     1)
     ssh root@10.1.1.2
     ;;
     2)
     ssh root@10.1.1.3
     ;;
     3)
     ssh root@10.1.1.4
     ;;
     5)
     exit
     ;;
     *)
     clear
     echo "输入错误,请重新输入..."
     ;;
 esac
 done
 ​
 自己完善功能:
 1. 用户选择主机后,需要事先推送公钥;如何判断公钥是否已推
 2. 比如选择web1时,再次提示需要做的操作,比如:
 clean log
 重启服务
 kill某个进程
 ​
 ​


补充:

 1) SIGHUP       重新加载配置    
 2) SIGINT       键盘中断^C
 3) SIGQUIT      键盘退出
 9) SIGKILL       强制终止
 15) SIGTERM     终止(正常结束),缺省信号
 18) SIGCONT    继续
 19) SIGSTOP    停止
 20) SIGTSTP     暂停^Z

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。