Shell-06 函数

Shell-06 函数

#编写脚本,使用chkconfig命令,循环执行,关闭所有5级别服务

#!/bin/bash
name=`chkconfig --list | cut -d' ' -f1`

for i in [name];do

        chkconfig --level 5 $i off

done

name=`chkconfig --list | awk '{print $1}'`

for i in $name;do

        if chkconfig --list $i | grep "5:off" &> /dev/null;then

                echo "这个$i服务已经关闭"

        else

                chkconfig --level 5 $i off

                echo "这个$i服务已经关闭"

        fi

 

done

1.函数介绍

为了避免代码的重复使用,我们一般通过函数编写代码块,而这个代码块用来实现某种功能。且这个功能在后面得代码中,会重复调用;

Def

2.函数的格式

function

格式1:

              Function fun_name{

                     函数体

}

       Fun_name()

【不调用函数,则函数体中的命令是不会被执行的;在哪里调用,函数体中的命令就在那里执行】

格式2:

       Fun_name(){

              函数体

$1 $2…$10

}

Fun_name 1 2 3

:wq

Fun_name 4 5 6 7 8 9 10 11 12 13 14

 

1.Case PATTERN支持的格式:* 任意内容start|stop) a*)

       Case语句中的pattern支持文件通配符的

2.*)

       Echo “Usage:please input{start|stop|restart|status}”    

  1. start)

if [ -e /var/lock/subsys/testd_name ] ;then

        echo “脚服务已启动”

else

        touch /var/lock/subsys/testd_name

        echo “服务启动成功”

fi

  1. stop)

if [ -e /var/lock/subsys/testd_name ] ;then

        rm -f  /var/lock/subsys/testd_name

        echo “服务挂关闭成功”

else

        echo “服务已关闭”

fi

  1. restart)

【将前面的代码写成函数】

    Start

Stop

  1. status

 

fun_start(){

        if [ -e /var/lock/subsys/testd_name ];then

                echo "服务已启动"

        else

                touch /var/lock/subsys/testd_name

                echo "服务启动成功"

        fi

}

fun_stop(){

        if [ -e /var/lock/subsys/testd_name ];then

                rm -f /var/lock/subsys/testd_name

                echo "服务关闭成功"

        else

                echo "服务已关闭"

        fi

}

fun_restart(){

        fun_stop

        fun_start

}

fun_status(){

        if [ -e /var/lock/subsys/testd_name ];then

                echo "testd_name is running"

        else

                echo "testd_name is stopped"

        fi

}

fun_usage(){

         echo "Usage: please input{start|stop|restart|status}"

}

if [ $# -lt 1 ];then

        Usage

        exit 1

fi

case $1 in

        start)

                fun_start

                ;;

        stop)

                fun_stop

                ;;

        reatart)

                fun_restart

                ;;

        status)

                fun_status

                ;;

        *)

                fun_usage

                ;;

esac

 

  1. 函数返回值得问题
useradd_1(){

       for i in `seq 1 10` ;do

              if id user$i &> /dev/null;then

                     echo “user$i 存在”

              else

                     useradd user$i &> /dev/null

                     echo “user$i OK”

                     return 0

              fi

       done

}

useradd_1

a)       当函数中指定了判断语句时,默认要返回一个错误结果,但是最近一条命令确实正确的,需要通过return来返回我们需要的正确的状态码。

b)      函数结束的时候,我们需要指定一个return的正确返回码;

如果使用循环语句时,return会跳出循环

Userdel -r 删除用户以及用户家目录

  1. 函数接收参数

函数 变量

和普通命令一样

只需要注意,在接收参数的时候,不会使用外部的传参,而是以脚本内部的参数为准

  1. 函数的变量

本地变量

                      Local 变量名=xxx

                      本地变量只在本函数的内部生效

局部变量

                      脚本内部的变量

环境变量

                      在整个Linux系统的bash中生效

i=1

TEST(){

        Local i=9

        Let i++

        Echo i

        Exit 0

}

TEST

Echo i

扩展:关于脚本执行的问题

a)       bash的方式来执行

bash所执行的脚本中定义的变量,在当前shell的子shell中

b)      通过全路径或者相对路径的方式来执行-------#!/bin/bash 需要授权执行权限;

c)       Source脚本文件或者.脚本文件

Source这种方式来执行脚本的时候,内部变量所定义的值是在当前的shell中的

  1. 函数递归

你 站在镜子的前面,后面又有一面镜子

n的阶乘

        n!=n*(n-1)!

        (n-1)!=(n-1)*(n-2)!

        fun(){

               if  [ $1 -le 1 ];then

                      echo 1

               else

                      q=$[$1*$(fun$[$1-1])]

                      echo $q

               fi

}

fun 5

 

 

兔子数列,斐波那契数列

1+1=2  1+2=3 2+3=5 3+5=8

1 1 2 3 5 8 13 21 34….

Fn = F(n-1)+F(n-2)

原文地址:https://www.cnblogs.com/KAJIA1/p/11392371.html