Bash 函数

17 Mar 2025 | 6 分钟阅读

在本主题中,我们演示了 bash 函数的基础知识以及它们在 bash shell 脚本中的工作方式。

bash 脚本中的函数是重用代码的绝佳选择。 Bash 函数可以定义为一组可以在 bash 脚本中多次调用的命令。 bash 中函数的作用是帮助您使脚本更具可读性,并避免反复编写相同的代码。 它还允许开发人员将复杂而冗长的代码分解为可以根据需要随时调用的较小部分。 函数可以随时重复调用,这将使我们能够重用、优化和最小化代码。

以下是关于 bash 函数的一些关键点

  • 必须在 shell 脚本中声明函数,然后才能使用它。
  • 参数可以传递给函数,并在函数内部作为 $1、$2 等访问。
  • 可以在函数内分配局部变量,并且此类变量的范围仅限于该特定函数。
  • 可以使用函数覆盖 Bash shell 的内置命令。

语法

声明 bash 函数的语法可以用两种格式定义

1. 第一种方法以函数名称开头,后跟括号。 这是最常用和常用的方法

单行版本可以如下所示

2. 第二种方法以函数保留字开头,后跟函数名称

单行版本可以如下所示

与大多数编程语言相比,Bash 函数在某种程度上受到限制。 让我们借助一些示例来理解这个概念

示例:方法 1

输出

Welcome to Javatpoint.

示例:方法 2

输出

Welcome to Javatpoint.

传递参数

与大多数编程语言一样,我们也可以传递参数并在 bash 函数中处理数据。 我们可以以类似于将命令行参数传递给 bash 脚本的方式将数据插入到函数中。

要将任意数量的参数传递给 bash 函数,我们需要在函数名称之后插入它们。 我们必须在函数名称和参数之间应用空格。 在参数周围使用双引号也是一个不错的选择,以防止对带有空格的参数进行错误解析。

以下是关于将参数传递给 bash 函数的一些关键点

  • 给定的参数将作为 $1、$2、$3 ... $n 被访问,对应于函数名称后的参数位置。
  • 变量 $0 被保留用于函数名称。
  • 变量 $# 用于保存传递给函数的参数/参数的数量。
  • 变量 $* 和 $@ 用于保存传递给函数的所有参数/参数。
    • 当 $* 与双引号一起使用(即 "$*")时,它将扩展为由空格分隔的单个字符串。 例如,"$1 $2 $n 等"。
    • 当 $@ 与双引号一起使用(即 "$@")时,它将扩展为单独的字符串。 例如,"$1" "$2" "$n" 等。
    • 当 $* 和 $# 没有与双引号一起使用时,它们都是一样的。

以下是说明如何将参数传递给函数并在函数内部访问参数的过程的代码。

Bash 脚本

输出

Bash Functions

在此脚本中,我们在调用 function_arguments 之后添加了值 "We"、"welcome"、"you"、"on" 和 "Javatpoint"。 这些值作为参数传递给 function_arguments 并存储在局部变量中。 但是,与其他语言不同,解释器将传递的值存储到预定义的变量中,然后根据传递参数的顺序命名这些变量。

例如:

"We" 单词存储到变量 1
"welcome" 单词存储到变量 2
"you" 单词存储到变量 3
"on" 单词存储到变量 4
"Javatpoint" 单词存储到变量 5

变量范围

全局变量定义为可以在脚本内的任何地方访问而与范围无关的变量。 默认情况下,所有变量都定义为全局变量,即使它们是在函数内部声明的。 我们也可以将变量创建为局部变量。 局部变量可以在函数体内部使用 ?local? 关键字声明,首次分配它们。 它们仅在该函数内部可访问。 我们可以在不同的函数中使用相同的名称创建局部变量。 要添加局部变量,我们可以使用以下语法

为了更好地理解变量范围在 Bash 脚本中的工作方式,请查看以下示例

Bash 脚本

输出

Bash Functions

根据输出,如果我们在函数主体内设置一个局部变量,该变量的名称与现有全局变量的名称相同,那么它将优先于全局变量。 全局变量可以在函数内部修改。

返回值

大多数编程语言都有为函数返回值 的概念。 这意味着该函数必须将数据发送回原始调用位置。 与 '真正' 的编程语言中的函数不同,Bash 函数在调用时不支持返回值。 但是,它们允许我们设置一个返回状态,类似于程序或命令如何使用退出状态退出。 当 bash 函数完成时,它的返回值是函数中最后执行的语句的状态。 它返回 0 表示成功状态,返回 1-255 范围内的非零十进制数表示失败。

可以使用 'return' 关键字指示返回状态,并将其分配给变量 $?。 return 语句终止函数,并用作函数的退出状态。

例如, 考虑以下代码

Bash 脚本

输出

Bash Functions

从函数返回值 的另一个更好的选择是使用 echoprintf 命令将值发送到 stdout,如下所示

Bash 脚本

输出

Welcome to Javatpoint.

覆盖命令

我们可以通过创建一个与我们要覆盖的命令同名的函数来选择覆盖 bash 命令。 例如,如果我们要覆盖 'echo' 命令,则必须创建一个名为 'echo' 的函数。

这种覆盖 bash 命令的概念在某些情况下可能很有用,例如,当我们希望使用带有特定选项的命令时。 此外,当我们不想在脚本中多次提供带有选项的整个命令时。 在这种情况下,我们可以覆盖带有选项的命令的内置 bash 命令。 现在,让我们借助一些示例来理解在 Bash Shell 脚本中覆盖命令的概念

示例

在此示例中,我们已经覆盖了 'echo' 命令,并在 'echo' 命令的参数中添加了时间戳。

Bash 脚本

输出

Bash Functions

结论

在本主题中,我们演示了 Bash 函数。 Bash 函数被认为是一个可重用的代码块,用于执行特定操作。 定义后,可以在脚本中多次调用它。


下一主题Bash 数组