Skip to content

函数的用法

在 Bash shell 脚本中,你可以定义函数并在脚本中调用它们。函数是一种将多个命令组合在一起的方式,以便在脚本中重复使用。

定义函数

在 Bash 中,你可以使用以下语法来定义函数:

sh
function function_name() {  
    # 函数体,即要执行的命令  
    echo "This is a function."  
    # 可以有更多的命令...  
}

或者,你也可以使用更简洁的语法(不需要 function 关键字):

sh
function_name() {  
    echo "This is a function."  
    # 可以有更多的命令...  
}

调用函数

一旦你定义了函数,就可以在脚本的其他地方通过函数名来调用它:

bash
#!/bin/bash  
  
# 定义函数  
hello_world() {  
    echo "Hello, World!"  
}  
  
# 调用函数  
hello_world

当你运行这个脚本时,它会输出 Hello, World!

函数参数

Bash 函数也可以接收参数,就像脚本本身可以接收命令行参数一样。在函数体内,你可以使用 $1$2$3 等来引用传递给函数的参数。此外,$# 表示传递给函数的参数数量,$* 表示所有参数(作为单个字符串),而 $@ 表示所有参数(作为单独的字符串列表)。

下面是一个使用参数的函数示例:

bash
#!/bin/bash  
  
# 定义函数,接受两个参数  
greet() {  
    echo "Hello, $1! Your favorite color is $2."  
}  
  
# 调用函数并传递参数  
greet "Alice" "blue"

这个脚本会输出 Hello, Alice! Your favorite color is blue.

函数返回值

在 Bash shell 中,函数通常通过其最后一个命令的退出状态来“返回”一个值。然而,Bash 函数并不直接支持像其他编程语言中那样的返回语句来返回一个具体的值。但你可以通过几种不同的方法来模拟返回值的行为。

使用退出状态

Bash 函数默认返回最后一个命令的退出状态。但是,你也可以使用 return 语句来显式地设置一个退出状态。在函数外部,你可以使用 $? 来获取上一个命令(包括函数调用)的退出状态。

bash
#!/bin/bash  
  
# 定义函数,根据输入返回不同的退出状态  
check_number() {  
    if [ $1 -gt 10 ]; then  
        return 0  # 成功退出状态  
    else  
        return 1  # 失败退出状态  
    fi  
}  
  
# 调用函数并检查返回值  
check_number 5  
if [ $? -eq 0 ]; then  
    echo "The number is greater than 10."  
else  
    echo "The number is not greater than 10."  
fi

这个脚本会输出 The number is not greater than 10.

使用命令替换(命令替换)

你也可以使用命令替换($(...) 或反引号 ...)来捕获函数的输出,并将其作为值使用。

bash
#!/bin/bash  
  
# 定义函数,输出问候语  
get_greeting() {  
    local name=$1  
    echo "Hello, $name!"  
}  
  
# 调用函数并捕获输出  
greeting=$(get_greeting "Alice")  
echo "$greeting"  # 输出:Hello, Alice!

在这个例子中,$(get_greeting "Alice") 捕获了 get_greeting 函数的输出,并将其存储在 greeting 变量中。然后你可以像使用任何其他变量一样使用 greeting 变量。

函数的注释

例子:

bash
# This function decides what version will be installed based on the following priority:
# 1. Environment variable `VERSION` is set.
# 2. Command line argument is passed.
# 3. Latest available on GitHub
function get_version() {
  if [[ -z "$VERSION" ]]; then
      if [[ -n "$1" ]]; then
          VERSION="$1"
      else
          VERSION=$(get_latest_version)
      fi
  fi
  echo $VERSION
}