• Xshell学习第八课:函数


    函数:
    1、函数介绍function
     为了避免代码重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能。
     且,这个功能在后面的代码中,会重复调用;
     
     def
    2、函数的语法格式
     函数的写法格式:
     function check_cpu {
      cat /proc/cpuinfo
     }
     ls /etc/
     check_cpu 【不调用函数,则函数体中的命令是不会执行的;在哪里调用,函数体中的命令就在那里执行】
     *fun_name() {
      函数体
      $1 $2 ... $10
     }
     fun_name 1 2 3
     :wq
     function.sh 4 5 6 7 8 9 10 11 12 13 14
    3、函数的调用  -- return
     函数返回值
     1、当函数中指定了判断语句的时候,我们默认要返回一个错误的结果,但是最近一条命令确实正确的,这时候,我们需要通过return返回一个我们需要的错误状态码;
     2、函数结束的时候,我们需要指定一个return的正确返回码;
     如果使用在循环语句中,return会跳出循环;
    4、函数接受参数
     函数 变量
     和普通的命令一样
     只需要注意,在函数接受参数的时候,不会使用外部的传参,而是以脚本内部的参数为准,
     
    5、函数中的变量
     本地变量
      local 变量名=xxx
      本地变量只在本函数内部生效
     局部变量
      脚本内部的变量
     环境变量
      在整个Linux系统的bash中生效
     
      TEST() {
       local i=9
       let i++
       echo i
       exit 0
      }
      i=1
      TEST
      echo i
     扩展: 关于脚本执行的问题:
     bash 的方式来执行 -- #!/bin/bash
      bash所执行的脚本中定义的变量,在当前shell的子shell中;
     全路径或者相对路径的方式来执行; -- 须有授权执行权限;
     source 脚本文件 或者 . 脚本文件
      source这种方式来执行脚本的时候,内部变量所定义的值是在当前shell中的;
    6、函数递归
     你 站在镜子前,后面又有一面镜子
     n的阶乘
      n! = n(n-1)!
               $[$1*  $[ fac -1]]
      fact(){
       if [ $1 -lt 1 ];then
        echo 1  //一定要写成1
       else
        i=$[$1*$(fact $[$1-1])]  //  n(n-1)
        echo $i
       fi
      }
      (n-1) = (n-1)(n-2)!
      。。。
      2!=2*1!
     fac(){
      $[fac -1 ]
     }
     fac 5

     兔子数列,斐波那契数列
      1 + 1 = 2
      1+ 1 + 1 = 3
      2 + 1 + 2  = 5
      3 +  5 = 8
                =   n
      1 1 2 3 5 8 13 21 34 ... n
      $[$(fab $[$1-1])+$(fab $[$1-2])]
      
      Fn = F(n-1) + F(n-2)
      
     #!/bin/bash
     #
     fab(){
         if [ $1 -eq 1 ];then
             echo 1
         elif [ $1 -eq 2 ];then
             echo 1
         else
             echo $[$(fab $[$1-1])+$(fab $[$1-2])]
         fi
     }
     fab 7

    练习
    1、脚本可以接受参数:start stop restart status
     case 参数 in
     start)
     stop)
     restart)
     status)
     *)
     【case PAT支持的格式:* 任意内容 start|stop)  a*) (case语句中的PAT是支持文件通配的) 】
    2、如果参数非此四者之一,提示使用个时候报错退出;
     *)
      echo "Usage:please input {start|stop|restart|status}"
    3、如果是start:则创建 /var/lock/subsys/SCRIPT_NAME,并显示“启动成功”【考虑:如果事先已经启动过一次,该如何处理?】
     start)
      if [ -e /var/lock/subsys/testd_name ];then
       echo "服务已启动" 
      else
       touch /var/lock/subsys/testd_name
       echo "服务启动成功"
      fi
    4、如果是stop:则删除/var/lock/subsys/SCRIPT_NAME,并显示“停止完成”;【考虑:如果事先已经停止过了,该如何处理?】
     stop)
      if [ -e /var/lock/subsys/testd_name ];then
       rm -f /var/lock/subsys/testd_name
       echo "服务关闭成功"
      else
       echo "服务已经关闭"
      fi
    5、如果restart,则先stop,再start;【考虑:如果本来没有start,如何出列?】
     restart)
      【将前面的代码写成函数】
      start
      stop
    6、如果是status,则
    如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running…”
    如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped …”
    i=file.txt
    Start() {
            if [ -e /root/$i ];then
                    echo "服务已经启动"
            else
                    touch /root/$i
                    echo "服务已启动"
            fi
    }
    Stop() {
            if [ -e /root/$i ];then
                    rm -f /root/$i
                    echo "服务已关闭"
            fi
    }
    Status() {
            if [ -e /root/$i ];then
                    echo "服务已开启"
            else
                    echo "服务已关闭"
            fi 
    }
    Usage() {
            echo "Usage:{/root/testd.sh start|stop|status|restart}"
    }
    if [ $# -lt 1 ];then
            Usage
            exit 1
    fi

    case $1 in
    start)
            Start
            ;;
    stop)
            Stop
            ;;
    restart)
            Stop
            Start
            ;;
    status)
            Status
            ;;
    *)
            Usage
            ;;
    esac
  • 相关阅读:
    解决Tomcat请求中文乱码的问题
    Bootstrap 兼容 IE
    Spring+MyBatis多数据源配置实现
    年度总结与计划
    AJAX 提交表单以及文件上传
    移动端Web开发调试工具:Chrome DevTools
    SpringMVC 之 @ResponseBody 和 @RequestBody
    goland快键键防忘
    MySQL日志文件影响数据库的各种类型活动
    何为云计算
  • 原文地址:https://www.cnblogs.com/huangchuan/p/11378545.html
Copyright © 2020-2023  润新知