zoukankan      html  css  js  c++  java
  • shell笔记_函数

    函数:

    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

  • 相关阅读:
    MS SQL float转nvarchar
    RDLC添加页码
    RDLC报表分页显示标题
    程序员必读书单
    SQL查询结果增加序号列
    SQL字符串分组聚合(分组后的数据查询后用逗号隔开)
    现在有一列是int的,把它变成5位的字符串,左边不够的补0
    oracle客户端精简绿色版-环境变量配置
    DISTINCT后按照DISTINCT之前的某列进行排序
    设计模式之代理模式
  • 原文地址:https://www.cnblogs.com/baocx/p/11400800.html
Copyright © 2011-2022 走看看