Bash函数本质上是一组可以多次调用的命令。函数的目的是帮助您使bash脚本更具可读性,并避免一遍又一遍地编写相同的代码。

与大多数编程语言相比,Bash函数能力相当有限。在本教程中,我们将介绍Bash函数的基础知识,并向您展示如何在shell脚本中使用它们。

Bash函数声明

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

第一种格式以函数名称开头,后跟括号。这是首选和更常用的格式。

function_name () {
  commands
}

单行版本:

function_name () { commands; }

第二种格式以function保留字开头,后跟函数名。

function function_name {
  commands
}

单行版本:

function function_name { commands; }

几点需要注意:

  • 花括号{}之间的命令列表是函数的主体。围绕函数体的花括号必须通过空格或换行符与主体分隔。
  • 定义函数并不会执行它。要调用bash函数,只需使用函数名称。只要在shell脚本中调用函数,就会执行花括号之间的命令。
  • 必须在调用任何函数之前定义函数。
  • 使用单行“压缩”函数时,分号;必须遵循函数中的最后一个命令。
  • 您应该始终尝试保持功能名称的描述性。

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

〜/hello_world.sh

1 #!/bin/bash
2
3 hello_world () {
4   echo 'hello, world'
5 }
6
7 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 表示成功和非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。使用此方法func_result变量将保存函数的结果。

将参数传递给Bash函数

要将任意数量的参数传递给bash函数,只需将它们放在函数名称后面,用空格分隔即可。最佳做法是用双引号将参数转义,以避免错误地使用带空格的参数。

  • 传递的参数为$1$2$3... $n,对应于该参数的函数名后的位置。
  • $0变量保留给函数的名称。
  • $#变量保存传递给函数的位置参数或者参数的数量。
  • $*$@变量保存传递给函数的所有位置参数或者参数。

这是一个例子:

〜/passing_arguments.sh

#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"
Hello Joe

结论

至此,您应该很好地理解如何编写bash函数。您可能还想了解如何使用Bash函数为更长的命令创建可记忆的快捷命令。如果您有任何问题或反馈,请随时发表评论。请在下面留言。如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持

如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持