函数:

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