shell编程——函数

1    函数的定义

function_name () 或 function function_name ()

{

    statement1

    statement2

    ...

}

函数必须在调用前定义

2    函数的调用

function_name param1 param2 ...

当用户定义了一个函数之后,实际上该函数就成为了一个合法的shell命令,可以在后续的脚本中使用。定义函数时需要圆括号,但调用时不需要圆括号。

3    函数的链接

所谓的函数链接,是指在某个shell中调用另外一个函数的过程

4    函数的返回值

在函数中,用户将需要返回的数据写入到标准输出,通常这个操作是使用echo语句来完成的。然后在调用程序中将函数的执行结果赋给一个变量。

eg.

length ()

{

    str=$1

    result=0

    if [ "$str" != " " ]; then

        result=${#str}

    fi

    echo "$result"

}

len=$(length "abc23")

由于用户可以将各种数据写入到标准输入,所以通过echo语句可以将各种数据作为返回值返回给函数调用者,而不仅仅局限于整数。因此,使用echo语句获得函数的返回值更加灵活和强大。

5    函数和别名

alias name="command"

alias ls="ls -l"

unalias ls   删除命令

我们定义了一个名称为ls的别名,而shell中已经存在了一个名称为ls的命令,但是在这种别名和同名命令同时存在的情况下,shell会优先使用用户定义的别名。

6    shell环境中定义函数

前文介绍的函数都是在脚本中定义的,实际上,用户可以直接在shell环境中定义函数,其方法就是直接在shell命令提示符后面一次输入函数名和函数体。

用户定义的shell函数可以通过unset命令来删除,删除以后的函数名将不再有效。

unset lsl()

7    全局变量与局部变量

默认情况下,除了与函数参数关联的特殊变量之外,其他所有变量都有全局的有效范围。另外,在函数内部,如果没有使用local关键字进行修饰,那么函数中的变量也是全局变量。

无论在何处,赋值语句都会影响全局变量的值,并且全局变量的值被改变了之后,在整个脚本内部有效。另外,默认情况下,在函数内部定义的变量也是全局变量,在脚本的任何位置都可以引用。

定义内部变量使用local关键字。

当某个程序中同时存在相同名称的全局变量和局部变量时,在函数内部,局部变量会屏蔽全局变量。也就是说,在函数内部,使用的是局部变量,而函数外面,使用的是全局变量。

8    函数参数

shell采取了相同的方法来处理脚本的参数和函数参数。因此,对于含有参数的函数,用户可以使用以下语法来调用。

function_name arg1 arg2 ...

shell的参数以空格隔开,如果某个参数中含有空格,则应该使用引号将其引用起来。

9    移动位置参数

在shell脚本中,可以使用shift命令来使得脚本的所有的位置参数向左移动一个位置。

10    通过getopts接收函数参数

getopts optstring [args]

11    间接参数传递

所谓间接参数传递,是指通过间接变量引用来实现函数参数的传递。如果某个变量的值又是另外一个变量的变量名,则该变量称为间接变量。

eg. 

var=name

name=john

$var=name

${!var}=john

${name}=john

name=alice

${name}=alice

${!var}=alice

12    传递数组参数

a=(a b "c d" e)

func "${a[@]}"

其中${a[@]}可以获取数组所有元素值

数组元素个数与函数func()的实际参数的个数是相同的,因此,用户可以使用系统变量$#来获取数组元素的个数。

变量${a[@]}外面使用双引号引用起来,因为数组a的第三个元素中含有空格,在这种情况下,如果将变量${a[@]}外面的双引号去掉,则会将第三个元素误认为是2个元素。

13    函数库文件

为了方便重用某些功能,可以创建一些可重用的函数,这些函数可以单独地放在函数库文件中

脚本与库文件之间的唯一区别在于函数库文件通常只包括函数,而脚本中可以既包含函数和变量的定义,又包含可执行的代码。

在shell中,载入库文件的命令为.,即一个圆点,其语法如下:

. filename

库文件可以使用相对路径,也可以使用绝对路径,圆点和库文件名之间必须要有一个空格。

在用户使用库文件时,必须在调用函数前将库文件载入。

14    递归函数

阶乘函数:

fact ()

{

    local n="$1"

    if [ "$n" -eq 0 ]

    then

        result=1

    else

        let "m=n-1"

        let "result=$n * $(fact m)"

    fi

    echo "$result"

}

fact "$1"

(此程序存在问题,待改正)

你可能感兴趣的:(shell编程——函数)