Unix / Linux - Shell 函数

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

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

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


创建函数

要声明一个函数,只需使用以下语法 −

function_name () { 
   list of commands
}

您的函数的名称是function_name,这就是您将用来从脚本的其他地方调用它的名称。 函数名后面必须跟圆括号,然后是用大括号括起来的命令列表。

示例

下面的例子展示了函数的使用 −

#!/bin/sh

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

# Invoke your function
Hello

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

$./test.sh
Hello World

向函数传递参数

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

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

#!/bin/sh

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

# Invoke your function
Hello Zara Ali

执行后,您将收到如下结果 −

$./test.sh
Hello World Zara Ali

函数返回值

如果您从函数内部执行exit 命令,其作用不仅是终止函数的执行,而且终止调用该函数的 shell 程序。

如果您只想终止函数的执行,则可以从已定义函数中退出。

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

return code

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

示例

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

嵌套函数

函数的一个更有趣的特性是它们可以调用自身以及其他函数。 调用自身的函数称为递归函数

下面的例子演示了两个函数的嵌套 −

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

提示函数调用

您可以将常用函数的定义放在您的 .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 中删除函数的定义,请使用带有 .f 选项的 unset 命令。 此命令还用于将变量的定义删除到 shell。

$ unset -f function_name