重击功能

Bash函数本质上是一组可以多次调用的命令。 函数的目的是帮助您使bash脚本更具可读性,并避免重复编写相同的代码。 与大多数编程语言相比,Bash函数有所限制。

在本教程中,我们将介绍Bash函数的基础知识,并向您展示如何在Shell脚本中使用它们。

定义Bash函数

声明bash函数的语法很简单。 函数可以两种不同的格式声明:

  1. 第一种格式以函数名称开头,后跟括号。 这是首选且使用较多的格式。

    function_name () {
      commands
    }

    单行版本:

    function_name () { commands; }
  2. 第二种格式以保留字开头 function,然后是函数名称。

    function function_name {
      commands
    }

    单行版本:

    function function_name { commands; }

需要注意的几点:

  • 花括号之间的命令({})称为函数的主体。 花括号必须与正文之间用空格或换行符分隔。
  • 定义函数不会执行它。 要调用bash函数,只需使用函数名称。 只要在shell脚本中调用函数,花括号之间的命令就会执行。
  • 函数定义必须放在对函数的任何调用之前。
  • 使用单行“压缩”功能时,请使用分号 ; 必须遵循函数中的最后一条命令。
  • 始终尝试使函数名称保持描述性。

为了更好地理解这一点,请看以下示例:

〜/ hello_world.sh

#!/bin/bash

hello_world () {
   echo 'hello, world'
}

hello_world

让我们逐行分析代码:

  • 在第3行中,我们通过给函数命名来定义函数。 大括号 { 标记函数主体的开始。
  • 线 4 是功能主体。 函数主体可以包含多个命令,语句和变量声明。
  • 线 5,右花括号 },定义结尾 hello_world 功能。
  • 排队 7 我们正在执行功能。 您可以根据需要多次执行该功能。

如果运行脚本,它将打印 hello, world

变量范围

全局变量是可以从脚本中的任何位置访问的变量,而不管其范围如何。 在Bash中,即使在函数内部声明,默认情况下所有变量也都定义为全局变量。

局部变量可以在函数体内通过以下方式声明: local 关键字,并且只能在该函数内部使用。 您可以在不同的函数中使用具有相同名称的局部变量。

为了更好地说明变量作用域如何在Bash中工作,让我们考虑以下示例:

〜/ variables_scope.sh

#!/bin/bash

var1='A'
var2='B'

my_function () {
  local var1='C'
  var2='D'
  echo "Inside function: var1: $var1, var2: $var2"
}

echo "Before executing function: var1: $var1, var2: $var2"

my_function

echo "After executing function: var1: $var1, var2: $var2"

该脚本首先定义两个全局变量 var1var2。 然后有一个设置局部变量的函数 var1 并修改全局变量 var2

如果运行脚本,应该会看到以下输出:

Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D

从上面的输出中,我们可以得出以下结论:

  • 当在函数体内设置与现有全局变量同名的局部变量时,它将优先于全局变量。
  • 全局变量可以在函数内部进行更改。

返回值

与“真实”编程语言中的函数不同,Bash函数不允许您在调用时返回值。 bash函数完成后,其返回值是该函数中执行的最后一条语句的状态, 0 表示成功,如果非十进制数字为1-255,则表示失败。

退货状态可以通过使用 return 关键字,并将其分配给变量 $?。 的 return 语句终止功能。 您可以将其视为函数的退出状态。

〜/ return_values.sh

#!/bin/bash

my_function () {
  echo "some result"
  return 55
}

my_function
echo $?
some result
55

要从函数实际返回任意值,我们需要使用其他方法。 最简单的选择是将函数的结果分配给全局变量:

〜/ return_values.sh

#!/bin/bash

my_function () {
  func_result="some result"
}

my_function
echo $func_result
some result

从函数返回值的另一个更好的选择是将值发送到 stdout 使用echo或 printf 如下图所示:

〜/ return_values.sh

#!/bin/bash

my_function () {
  local func_result="some result"
  echo "$func_result"
}

func_result="$(my_function)"
echo $func_result
some result

我们不是简单地执行将消息打印到stdout的函数,而是将函数输出分配给 func_result 使用 $() 命令替换。 以后可以根据需要使用该变量。

将参数传递给Bash函数

要将任意数量的参数传递给bash函数,只需将其放在函数名称之后,并以空格分隔即可。 最好对参数加双引号,以免参数中带有空格的配置错误。

  • 传递的参数是 $1$2$3$n,对应于函数名称后的参数位置。
  • $0 变量是为函数名称保留的。
  • $# 变量保存传递给函数的位置参数/参数的数量。
  • $*[email protected] 变量保存传递给函数的所有位置参数/参数。
    • 双引号时, "$*" 扩展为由空格分隔的单个字符串(IFS的第一个字符)- "$1 $2 $n"
    • 双引号时, "[email protected]" 扩展为单独的字符串- "$1" "$2" "$n"
    • 如果不加双引号, $*[email protected] 是相同的。

这是一个例子:

〜/ passing_arguments.sh

#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"
Hello Joe

结论#

Bash函数是旨在执行特定操作的可重用代码块。 定义后,可以在脚本中多次调用该函数。

您可能还想阅读有关如何使用Bash函数为较长的命令创建令人难忘的快捷键命令的信息。

如果您有任何疑问或反馈,请随时发表评论。

bash终端

Sidebar