shell之函数

来源:互联网 发布:无锡招聘淘宝模特 编辑:程序博客网 时间:2024/06/03 20:25

一 函数

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

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

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

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

函数定义:

function_name()

{

       statement1

}

(也可以加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

(ab后面有冒号,可以含有参数,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()

{

#12都是文件描述符,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 $?"

 

0 0
原创粉丝点击