ITEEDU

第 11 章 函数

摘要

本章,我们将讨论

  • 什么是函数

  • 从命令行建立并显示函数

  • 脚本中的函数

  • 向函数传递参数

  • 使用函数的时机

11.1. 介绍

11.1.1. 什么是函数?

shell函数是一种为后续操作组织命令的方法,使用单个名字来命名这些命令组或者 routine。在shell或者是脚本当中,这个过程的名字必须是唯一的。所有用来组织函数的命令就像普通命令一样执行。当以一个简单的命令名来调用函数的时候,和该函数相关的命令就被执行。函数在必须声明,然后在shell里执行:没有新的进程会被创建来打断这个命令。

特殊的内建命令在命令查找中先于shell函数。特殊的内建命令:break, :, ., continue, eval, exec, exit, export, readonly, return, set, shift, trapunset.

11.1.2. 函数语法

函数使用以下2种形式。

function FUNCTION { COMMANDS; }

或者

FUNCTION () { COMMANDS; }

两者都定义了一个shell函数 FUNCTION 。内建的 function 命令是可选的;然而,如果不使用,必须在函数名后加上小括号。

The commands listed between curly braces make up the body of the function. These commands are executed whenever FUNCTION is specified as the name of a command. The exit status is the exit status of the last command executed in the body.

[注意] 通常的错误

The curly braces must be separated from the body by spaces, otherwise they are interpreted in the wrong way.

函数体必须以分号或者新行结尾。

11.1.3. 函数中的位置参数

函数就像是迷你脚本:他们可以接受参数,他们可以使用只有在函数中有效的变量(使用本地内建 local )并且他们可以向调用者返回参数。

一个函数也有解释位置参数的机制,然而传递给函数的参数和传递给命令或者脚本的参数是不一样的。

当函数开始执行,在执行期间函数的参数变成位置参数。扩展为位置参数的数量的特别参数 # 更新来反映这个变化。位置参数 0 未改变。Bash变量 FUNCNAME 在函数执行时被设置为函数的名字。

如果内建的 return 在函数中执行时,在调用完成后函数完成并且执行下一条命令。当函数完成后,位置参数的值和特别参数 # 被重置到函数执行前的值。如果一个数字参数被赋予 return ,那个状态就返回了。一个简单的例子:

[lydia@cointreau ~/test] cat showparams.sh
#!/bin/bash
                                                                                
echo "This script demonstrates function arguments."
echo
                                                                                
echo "Positional parameter 1 for the script is $1."
echo
                                                                                
test ()
{
echo "Positional parameter 1 in the function is $1."
RETURN_VALUE=$?
echo "The exit code of this function is $RETURN_VALUE."
}
                                                                                
test other_param

[lydia@cointreau ~/test] ./showparams.sh parameter1
This script demonstrates function arguments.
 
Positional parameter 1 for the script is parameter1.
 
Positional parameter 1 in the function is other_param.
The exit code of this function is 0.

[lydia@cointreau ~/test]

注意函数的返回值或者退出代码通常储存在一个变量中,因此在以后也可以探测到。你系统的初始脚本使用一种在条件测试中探测 RETVAL 值的技巧,像这样:

if [ $RETVAL -eq 0 ]; then
	<start the daemon>

或者像来自 /etc/init.d/amd 使用Bash优化特性使用的例子:

[ $RETVAL = 0 ] && touch /var/lock/subsys/amd

&& 后的命令只有在测试是真的时候才执行;这是一个简单的代替 if/then/fi 结构的方法。

函数的返回值通常被用作整个脚本的退出代码,你将会看到很多初始脚本用 exit $RETVAL 来结束。

11.1.4. 显示函数

所有被当前shell所识别的函数可以用 set 显示出来。函数在他们被使用后保留,除非使用后进行 unsetwhich 命令也可以显示函数:

[lydia@cointreau ~] which zless
zless is a function
zless ()
{
    zcat "$@" | "$PAGER"
}

[lydia@cointreau ~] echo $PAGER
less

这是一种典型的配置在用户shell资源配置文件里的函数。函数比起使用别名和提供一个简单且方便的方法来配合用户的环境更灵活。

以下是为了方便DOS用户:

dir ()
{
    ls -F --color=auto -lF --color=always "$@" | less -r
}