如何在 Bash 中使用函数

Suraj Joshi 2023年1月30日
  1. 在 Bash 中定义函数
  2. Bash 中变量的作用域
  3. Bash 中函数的返回值
  4. 向 Bash 函数传递参数
如何在 Bash 中使用函数

函数是每个编程语言中最重要的一个方面,它使我们的代码具有可重用性和可读性。重复使用的同一段代码就写在函数里面。而当我们需要代码块时,我们只需调用定义的函数即可。

在 Bash 中定义函数

要在 Bash 中定义函数,我们可以使用以下两种方法中的任何一种。

在这种方法中,我们写下函数的名称,后面加括号。然后,我们在大括号内定义函数。使用这种格式的函数可以使用任何一种格式来定义。

function_name(){
statements
}
function_name() { statements }

在这种方法中,我们在函数名称前指定 function 关键字。

function_name(){
statements
}
function_name() { statements }

大括号内的语句决定了函数的作用。函数名与函数的作用无关,但我们必须使函数名具有描述性。定义函数不会有任何作用。要执行函数定义中的命令,我们必须调用函数。

要在 Bash 中调用函数,我们使用函数的名称。

#! /bin/bash

greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

输出:

Hello, Folks. Welcome to DelftStack!

在这里,我们在一开始就用 greet 这个名字定义函数,然后调用函数。当我们调用函数的时候,函数定义里面的语句就会被执行,因此我们看到 Hello, Folks. Welcome to DelftStack! 在终端打印出来。

我们还可以使用另一种方法来定义函数:

#! /bin/bash

function greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

输出:

Hello, Folks. Welcome to DelftStack!

我们必须确保在调用函数之前,我们总是先定义函数。

Bash 中变量的作用域

在 Bash 中, 变量的作用域可以是全局的, 也可以是局部的. 然而, 变量的默认作用域总是全局的, 即使它是在函数作用域内声明的. 我们必须使用 local 关键字来使一个变量成为局部变量。

#! /bin/bash

gvar1=1
gvar2=2

change_variables() {

    local gvar1=10
    gvar2=7
    
    echo "Inside Function: gvar1: $gvar1, gvar2: $gvar2"
}

echo "Before executing function: gvar1: $gvar1, gvar2: $gvar2"

change_variables

echo "After executing function: gvar1: $gvar1, gvar2: $gvar2"

输出:

Before executing function: gvar1: 1, gvar2: 2
Inside Function: gvar1: 10, gvar2: 7
After executing function: gvar1: 1, gvar2: 7

在这里,声明在顶部的 gvar1gvar2 是全局变量。

在函数内部,由于我们对 gvar1 使用了 local 关键字,所以 gvar1 被声明为一个局部变量,而 gvar2 仍然是一个全局变量,因为它没有 local 关键字。因此,gvar2 的值是由函数全局改变的,而 gvar1 的值只在函数内部改变。

Bash 中函数的返回值

与其他编程语言相反,Bash 不允许我们从函数中返回值。Bash 函数返回的值是函数中最后一条语句的执行状态。数字 0 代表成功,而从 1-255 代表失败。我们可以用 return 关键字来指定函数的退出状态。return 语句也会终止函数的执行。

#! /bin/bash

return_value(){
  echo "This function returns 20!"
  return 30
  echo "After return statement"
}

return_value
echo $?

输出:

This function returns 20!
30

在这里,我们可以看到,函数 return_value 使用 return 语句返回值 30,该值被分配到 $? 变量。

我们还可以注意到,在执行完 return 语句后,函数就终止了,因为 return 语句下面的命令不会被执行。

如果我们想从函数中返回某个值,我们可以将该值赋给一个全局变量,然后从函数外部访问该变量来检索该值。

#! /bin/bash

send_message(){
  message_from_function="Hello From the function!"
}
send_message
echo $message_from_function

输出:

Hello From the function!

在程序中,我们把要返回的值分配给全局变量 message_from_function,然后访问该变量的返回值。

向 Bash 函数传递参数

要将参数传递给一个 Bash 函数,我们只需将参数放在函数后面即可。如果我们想向一个函数传递多个参数,我们可以用空格将参数分开。为了避免参数的误码,我们可以用双引号来包裹参数。

根据参数的位置用 $1$2 等方式访问。$0 代表函数名称,而 $# 则表示函数中位置参数的数量。

#! /bin/bash

send_message(){
  message_from_function="Hello $1 "
}
send_message
echo $message_from_function "Delft!"

输出:

Hello Delft!

在这里,参数 Delft!被传入函数,并在函数中通过参数 $1 访问,我们得到 Hello Delft!作为函数的最终输出。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn