shell之函数

一 函数shell

    函数与shell脚本没有明显区别,但在执行时有本质区别:bash

    对于一个单独的shell脚本,执行时为其建立一个新的shell进程,并解释并执行脚本中代码函数

    当脚本执行完成,该shell进程自动结束this

    对于函数来讲,调用时不会单首创建一个shell进程,而是在调用者的shell进程中直接解释并执行函数中的代码命令行

    函数定义:递归

    function_name()进程

    {ip

           statement1get

    }string

    (也能够加function关键字,函数在调用前必须定义)

    例子:

    #! /bin/bash

    #定义函数

    functionsayhello()

    {

       echo "Hello, World!"

    }

    #调用函数

    sayhello

    函数调用:

    function_nameparam1 param2

    函数连接:

    在某个shell函数中调用另一个函数的过程

    例子:

    #! /bin/bash

    #定义函数john()

    john()

    {

       echo "Hello, this is John."

    }

    #定义函数alice

    alice()

    {

       #调用函数john

       john

       echo "Hello, this is Alice."

    }

    #调用函数alice

    alice

    结果:Hello, this is John.

             Hello,this is Alice.

     

    函数返回值:

    shell能够用return语句来返回某个数值,只能返回0-255直接整数值,函数中的return语句其实是用来返回函数的退出状态码

    例子:

    #! /bin/bash

    #定义求和函数

    sum()

    {

       let "z = $1 + $2"

       #将和做为退出状态码返回

       return "$z"

    }

    #调用求和函数

    sum 22 4

    #输出和

    echo"$?"

    结果:26

    (超过255会出错,如sum 253 4)

    设置别名:

    alias name=”command”

    (name为要指定的名,command为原有shell命令)

    函数和别名区别:

    用户不能为一组命令指定别名

    别名中不能经过系统变量操做参数列表

    不用某个别名时,unalisa name

二 函数参数
 2.2 获取函数参数个数

    经过$#来获取脚本参数的个数

    #! /bin/bash

    #定义函数

    func()

    {

       #输出参数个数

       echo "the function has $#parameters."

    }

    #调用函数

    func a b c d e f ghello

    func 12 3"hello world"

    func

    (若参数中有空格,要用引号引发来)

 2.2 经过位置变量接收参数值:

    $0:脚本名称

    $1:第一个参数

    $2:第二个参数

    $@和$*:全部参数

    例:

    #! /bin/bash

     #定义函数

    func()

    {

       #输出全部的参数hello world

       echo "all parameters are $*"

       #输出全部的参数hello world

       echo "all parameters are $@"

       #输出脚本名称

       echo "the script's name is $0"

       #输出第1个参数 hello

       echo "the first parameter is $1"

       #输出第2个参数 world

       echo "the second paramter is $2"

    }

    #调用函数

    func hello world

2.3 移动位置参数

    shift命令使脚本全部参数左移一个位置

    #! /bin/bash

    #定义函数

    func()

    {

       #经过while循环和shift命令依次获取参数值,$#获取传递给函数的参数个数

       while (($# > 0))

       do

    #shift命令参数位置左移一个,原来的第二个参数会变成第一个,每次输出$1就能够了

          echo "$1"  

          shift

        done

    }

 2.4 经过getopts接收函数参数

    getopts获取函数的选项以及参数值,或者是脚本的命令行选项以及参数值

    getopts optstring[args]

    参数optstring包含一个能够为getopts命令识别的选项名称列表。若是某个选项名称的后面跟随着一个冒号,则表示用户能够为该选项提供参数值,同时参数值被保存到名称为$OPTARG的系统变量中。

    getopts依次遍历每一个选项,选项名称被保存到args变量中。

    #! /bin/bash

    #定义函数

    func()

    {

       #逐个接收选项及其参数

       while getopts "a:b:c" arg

       do

          #当指定了-a选项时

          case "$arg" in

             a)

                #输出-a选项的参数值

                echo "a's argument is$OPTARG"

                ;;

             b)

                echo "b's argument is$OPTARG."

                ;;

             c)

                echo "c"

                ;;

             ?)

                #未知选项

                echo "unkown argument."

                exit 1

                ;;

          esac

       done

    }

    #调用函数

    func -a hello -bworld

    结果:a's argument is hello

          b's argument is world

    (a,b后面有冒号,能够含有参数,c不含参数,循环过程当中,当前选项名称被保存到arg中,选项的参数值被保存到系统变量$OPTARG中。当用户提供-c选项是,只是简单输出字符c)

 2.5 间接参数传递:

    经过间接变量引用来实现函数的参数的传递。若是某个变量的值又是另一个变量的变量名,则该变量称为间接变量。

    var=name

    name=john

    第二个变量能够用两种方式引用:

    ${name}

    ${!var}

    (shell中间接引用语法为${!var_name})

 三 函数库文件

    脚本与库文件之间的区别在于函数库文件只包括函数,脚本能够即包括函数和变量的定义,又包括执行的代码。

    库文件有主程序载入并执行,用户无需拥有库文件的执行权限,只要读权限就能够。

3.1 函数库文件的调用

. filename(圆点和文件名之间有空格)

    #! /bin/bash

    #载入函数库

    . lib.sh

    #定义变量

    msg="the fileis not found."

    #调用函数库中的函数

    error $msg

    lib.sh文件:

    #! /bin/bash

    #定义函数

    error()

    {

    #1和2都是文件描述符,1为标志输出,2标准错误输出,>&复制一个输出描述符

       echo "ERROR:" $@ 1>&2

    }

    warning()

    {

       echo "WARNING:" $@ 1>&2

    }

    结果:ERROR:the file is not found

3.2 递归函数

    调用过程就是反复的调用本身

    #! /bin/bash

    #定义递归函数

    fact()

    {

       #定义局部变量

       local n="$1"

       #当n等于0时终止递归调用

       if [ "$n" -eq 0 ]

       then

          result=1

       else

          #当n大于0时,递归计算n-1的阶乘

          let "m=n-1"

          fact "$m"

          let "result=$n * $?"

       fi

       #将计算结果以退出状态码的形式返回

       return $result

    }

    #调用递归函数

    fact"$1"

    echo"Factorial of $1 is $?"

相关文章
相关标签/搜索