zoukankan      html  css  js  c++  java
  • Shell:Day07.笔记

    函数:
    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
  • 相关阅读:
    关于基本的线程的生命周期
    HTML Response ContentType 大全
    IE与Firefox的CSS兼容大全
    文件上传代码
    C#.NET里面抽象类和接口有什么区别
    用SQL命令创建数据库
    JS根据生日算岁数
    改变Iframe的Src
    JS做加法精度问题
    真正的问题应该在我身上……
  • 原文地址:https://www.cnblogs.com/why098/p/11378989.html
Copyright © 2011-2022 走看看