Unix 简明教程

Unix / Linux - Shell Functions

在本章中,我们将详细讨论 Shell 函数。使用函数可以将脚本的整体功能分解为更小的逻辑子部分,然后根据需要调用它们来执行各自的任务。

使用函数执行重复任务是创建 code reuse 的绝佳方式。这是现代面向对象编程原则的重要组成部分。

Shell 函数类似于其他编程语言中的子例程、过程和函数。

Creating Functions

要声明函数,只需使用以下语法:

function_name () {
   list of commands
}

函数的名称是 function_name ,您将在脚本中的其他地方使用它来调用此函数。函数名称后面必须紧跟括号,然后是一对大括号中包含的命令列表。

Example

以下示例显示了函数的用法:

#!/bin/sh

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

# Invoke your function
Hello

执行后,您将收到以下输出:

$./test.sh
Hello World

Pass Parameters to a Function

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

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

#!/bin/sh

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

# Invoke your function
Hello Zara Ali

执行后,您会收到以下结果 −

$./test.sh
Hello World Zara Ali

Returning Values from Functions

如果您从函数内部执行 exit 命令,其效果不仅会终止函数的执行,还会终止调用该函数的 shell 程序。

如果您只想终止函数的执行,则有方法退出已定义的函数。

根据具体情况,您可以使用 return 命令从函数返回任何值,其语法如下:

return code

此处 code 可以是您选择的内容,但显然您应该选择在整个脚本上下文中具有意义或有用的内容。

Example

以下函数返回一个值 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"

执行后,您会收到以下结果 −

$./test.sh
Hello World Zara Ali
Return value is 10

Nested Functions

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

以下示例演示两个函数的嵌套 –

#!/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...

Function Call from Prompt

可以在 .profile 内放置常用函数的定义。每当你登录时,这些定义都会可用,你可以在命令提示符中使用这些定义。

或者,你可以将定义分组放在一个文件中,称为 test.sh ,然后通过键入以下内容在当前 shell 中执行文件 –

$. test.sh

这会产生一个效果,就是由 test.sh 定义的函数被读入并定义到当前 shell,如下所示 –

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

若要从 shell 中删除函数定义,请使用 unset 命令和 .f 选项。此命令还用于删除对 shell 的变量定义。

$ unset -f function_name