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

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

声明bash函数的语法非常简单。它们可以以两种不同的格式声明。第一种格式以函数名称开头,后跟括号。这是首选和更常用的格式。

function_name () {
  commands
}

单行版本:

function_name () { commands; }

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

function function_name {
  commands
}

单行版本:

function function_name { commands; }

花括号{}之间的命令列表是函数的主体。围绕函数体的花括号必须通过空格或换行符与主体分隔。

定义函数并不会执行它。要调用bash函数,只需使用函数名称。只要在shell脚本中调用函数,就会执行函数体的命令。

必须在调用任何函数之前定义函数。使用单行函数时,分号;必须遵循函数中的最后一个命令。您应该始终尝试保持函数名称的描述性。

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

1 #!/bin/bash
2
3 hello_world () {
4   echo 'hello, world'
5 }
6
7 hello_world
〜/hello_world.sh

在行3中,我们通过命名方式来定义函数,并使用花括号{标记函数体的开始。行4是函数体。函数体可以有多个命令。

5,结束花括号},定义hello_world函数的结尾。在行7我们正在执行该函数。您可以根据需要多次执行该函数。如果您运行该脚本,它将打印hello, world

变量作用域

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

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

为了更好地说明变量作用域范围在Bash中的工作原理,让我们考虑一个例子:

#!/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"
〜/variables_scope.sh

脚本首先定义两个全局变量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语句会终止函数。您可以将其视为函数的退出状态。

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

从函数获得返回值的另一个更好选择是使用echo或printf将值发送到标准输出stdout

#!/bin/bash

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

my_function
echo $?
$?作为返回值
some result
55

#!/bin/bash

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

func_result="$(my_function)"
echo $func_result
使用echo作为函数返回值
some result

我们执行的函数不是简单地将消息打印到标准输出,而是使用$()机制分配给变量func_result。使用此方法func_result变量将保存函数的结果。

Bash函数参数

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

传递的参数可以通过变量$1$2$3... $n,索引1...n对应于参数在函数名后的位置。

$0变量保留给函数的名称。$#变量保存传递给函数的位置参数或者参数的数量。$*$@变量保存传递给函数的所有位置参数或者参数。

#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"
〜/passing_arguments.sh
Hello Joe

结论

至此,您应该很好地理解如何编写bash函数。您可能还想了解如何使用Bash函数为更长的命令创建可记忆的快捷命令

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