Bash函数

评论 0 浏览 0 2019-01-15

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

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

~/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 变量是为函数的名称保留的。
  • $#变量保存了传递给函数的位置参数/参数的数量。
  • $*$@变量存放所有传递给函数的位置参数/参数。
    • 当双引号时,"$*"扩展为一个由空格(IFS的第一个字符)隔开的单个字符串--"$1 $2 $n"
    • 当双引号时,"$@"会扩展为独立的字符串--"$1" "$2" "$n"
    • 当不使用双引号时,$*$@是一样的。

下面是一个例子。

~/passing_arguments.sh
#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"

输出

Hello Joe

总结

Bash函数是一个可重复使用的代码块,旨在执行一个特定的操作。一旦定义了这个函数,就可以在一个脚本中多次调用。

你可能还想读一下如何使用Bash函数为一条较长的命令创建一个可记忆的快捷命令的内容。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-07-04
0 个评论
标签