熟悉 Shell脚本:函数

函数

函数的定义

由于Shell脚本是从头开始执行的,所以Shell规定,函数必须在调用前定义。

在Shell语言中,用户可以通过两种语法来定义函数,分别如下:

熟悉 Shell脚本:函数

熟悉 Shell脚本:函数

上面两种语法的区别在于后者在函数名称前面使用了function关键字。其中function_name表示函数名称。

Shell中的函数的命名规则与变量的命名规则基本相同,可以使用数字、字母或者下划线,但是只能以字母或者下划线开头。

另外,用户应该尽量使用有意义的英文单词来命名函数,以利于提高代码的可读性。

函数的调用

熟悉 Shell脚本:函数

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

函数返回值

return:使用return语句来返回某个数值,这与绝大部分的程序设计语言是相同的。但是,在Shell中,return语句只能返回某个0~255之间的整数值,如果超出这个范围,则会返回错误的结果。

echo:在Shell中,还有一种更加优雅的方法可以帮助用户获得函数执行后的某个结果,那就是使用echo语句。

函数和别名

在Shell中,与函数比较相似的一个概念就是别名。一个别名是一个Shell命令的缩写或者其他容易记忆的名称。用户可以使用alias命令来设置别名,其基本语法如下:

熟悉 Shell脚本:函数

函数和别名的相似之处在于,它们都是通过一个名称映射到一个或者一组命令。例如函数是函数名到一组Shell命令的映射,而别名则是别名到一个Shell命令的映射。无论是函数还是别名,在调用时都是执行其所对应的相关命令。

函数参数

Shell将脚本参数和函数参数做了统一地处理。也就是说,Shell采用了相同的方法来处理脚本的参数和函数参数。

熟悉 Shell脚本:函数

当用户在Shell脚本中定义函数时,实际上并没有指定该函数到底拥有多少个参数。函数最终会有多少个参数,取决于用户在调用该函数时为该函数提供了多少个参数。

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

传递数组参数

严格地讲,Shell并不支持将数组作为参数传递给函数,但是用户仍然可以通过一些变通的方法实现数组参数的传递。首先,用户可以将数组的元素展开,然后作为多个由空格隔开的参数传递给函数。下面举例说明这种传递参数的方法。

熟悉 Shell脚本:函数

在上面的代码中,函数内部通过while循环语句配合shift命令将数组元素逐个接收过来。

熟悉 Shell脚本:函数

函数库文件

函数库文件的定义

我们写过一些脚本,用来完成一些特定的任务。许多脚本都要执行一些常用的操作,例如显示出错信息和警告信息,以及提示用户输入等。为了方便地重用这些功能,可以创建一些可重用的函数。这些函数可以单独地放在函数库文件中。

由于函数库文件是由主程序载入并执行的,所以用户无需拥有库文件的执行权限,只要拥有读取权限即可。

熟悉 Shell脚本:函数

从上面的代码可以看出,函数库文件与普通的脚本的结构完全相同。通常情况下,用户应该为函数库文件提供有意义的名称,例如errors.sh或者math.sh等。同时,为了便于管理,应该将所有的库文件单独放到一个目录中,例如lib等。

函数库文件的调用

当库文件定义好之后,用户就可以在程序中载入库文件,并且调用其中的函数。在Shell中,载入库文件的命令为.,即一个圆点,其语法如下:

熟悉 Shell脚本:函数

其中,参数filename表示库文件的名称,必须是一个合法的文件名。库文件可以使用相对路径,也可以使用绝对路径。另外,圆点命令和库文件名之间有一个空格

熟悉 Shell脚本:函数

递归函数

Linux的Shell也支持函数的递归调用。也就是说,函数可以直接或者间接地调用自身。在函数的递归调用中,函数既是调用者,又是被调用者。