Menu Close

外壳函数

在本章中,我们将详细讨论shell函数。 函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。

编程序时在需要的时侯调用这些函数来执行其各自的任务。Shell 函数必须先定义后使用。使用函数执行重复性任务是现代面向对象编程的重要组成部分。

Shell 函数的定义格式如下:


function_name () {
    list of commands
    [ return value ]
}

也可以在函数名前加上关键字 function:

function function_name () {
    list of commands
    [ return value ]
}

函数返回值,可以利用return语句;如果不加,会将最后一条命令运行结果作为返回值。

将参数传递给函数

您可以定义一个在调用函数时接受参数的函数。 这些参数将由$ 1,$ 2等表示。

下面是一个示例,其中我们传递了两个参数Zara和Ali,然后捕获并在函数中打印这些参数。

# Define your function here
Hello () {
   echo "Hello World $1 $2"
}

# Invoke your function
Hello Zara Ali

函数return值

如果从函数内部执行退出命令,则不仅是终止函数的执行,而且还终止调用该函数的Shell程序的执行。

相反,如果您只想终止函数的执行,您可以使用以下语法的return命令从函数中返回任何值:

return code

在这里,code可以是您在此处选择的任何内容。但是,您最好选择在整个脚本上下文中有意义或有用的内容。

例如

下列函数return值10

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}

# Invoke your function
Hello Zara Ali

# Capture value returnd by last command
ret=$?

echo "Return value is $ret"

函数嵌套

函数更有趣的功能之一是它们可以调用自己以及其他函数。 调用自身的函数称为递归函数。

#!/bin/sh

# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}

number_two () {
   echo "This is now the second function speaking..."
}

# Calling function one.
number_one

执行结果:

This is the first function speaking...
This is now the second function speaking...

像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如下所示:

$ unset -f function_name