Skip to content

自定义函数

bash shell 会将函数当作小型脚本来对待,它的基本语法:

bash
function function_name {
	commands
}

# 或者

function_name () {
   commands
}

commands 是组成函数的一个或多个 bash shell 命令。在调用函数的时候,bash shell 会一次执行函数内的命令。

例子:

bash
#!/bin/sh

# 函数定义
hello () {
   echo "Hello World"
}

# 函数调用
hello

需要注意,函数调用需要在函数被定义之后去调用,否则会报错。

向函数传递参数

由于 bash shell 会将函数当作小型脚本来对待,这意味着我们可以像普通脚本那样向函数传递参数:

bash
#!/bin/sh

# 函数定义
hello() {
    local full_name="$1 $2"
    echo "Hello, $full_name!"
}

# 函数调用
hello "Ryan" "Luo"

在函数体中,$1读取第一个函数参数,$2读取第二个函数参数,如此类推。

返回值

Bash Shell 把函数视为一个小型脚本,运行结束时退出状态码是函数中最后一个命令返回的退出状态码,可以通过 $?来确定函数的退出状态码。也正是函数退出状态码仅反应最后一个命令,因此是没法确定其他命令是否执行成功。鉴于使用函数的默认退出状态码是一种危险的做法,因此我们可以借助 return命令来指定函数的退出状态码,注意状态码必须介于 0~255:

bash
#!/bin/sh

# 函数定义
foo() {
    return 0
}
# 函数调用
foo
# $? 获取函数返回值之前切忌执行别的命令,否则函数的返回值会丢失
echo $?

使用函数输出

命令的输出可以保存到 shell 变量中,同样函数的输出也可以保存到 shell 变量中:

bash
#!/bin/bash

foo() {
    echo 'a'
}

bar=$(foo)
echo $bar # 输出 'a'

需要注意的是函数中执行的命令的标准输出以及标准错误输出,是不会包含到变量中的。

函数嵌套

bash
#!/bin/sh

# 函数定义
foo() {
    echo "Hello, world!"
}

bar() {
    foo
}

# 函数调用
bar

局部变量

默认情况下,在脚本中声明变量为该脚本的全局变量。但是在函数内部是可以使用 local来声明局部变量的,通过 local声明的局部变量并不会影响到外部,下面通过两个例子来了解通过 local声明变量的作用范围:

bash
#!/bin/bash

foo() {
    hello="Hello world!"
}

foo
echo $hello # 输出 "Hello world!"
bash
#!/bin/bash

foo() {
    local hello="Hello world!"
}

foo
echo $hello # 输出为空