[shell(6)| 青训营笔记]

70 阅读1分钟

函数

bash中的函数类似于C/C++中的函数,但return的返回值与C/C++不同,返回的是exit code,取值为0-255,0表示正常结束。

如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果。

函数的return值可以通过$?来获取。

命令格式:

[function] func_name() {  # function关键字可以省略
语句1
语句2
...
}

不获取 return值和stdout

示例

func() {
name=yxc
echo "Hello \$name"
}

func

输出结果:

Hello yxc

获取 return值和stdout值

不写return时,默认return 0

示例

func() {
name=yxc
echo "Hello \$name"

    return 123

}

output=$(func)
ret=$?

echo "output = $output"
echo "return = $ret"

输出结果:

output = Hello yxc
return = 123

函数的输入参数

在函数内,1表示第一个输入参数,1表示第一个输入参数,2表示第二个输入参数,依此类推。

注意:函数内的$0仍然是文件名,而不是函数名。

示例:

    func() {  # 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0
        word=""
        while [ "${word}" != 'y' ] && \[ "${word}" != 'n' ]
        do
            read -p "要进入func($1)函数吗?请输入y/n:" word
    done

        if [ "$word" == 'n' ]
        then
            echo 0
            return 0
        fi  

        if [ $1 -le 0 ] 
        then
            echo 0
            return 0
        fi  

        sum=$(func $(expr $1 - 1))
        echo $(expr $sum + $1)

    }

echo \$(func 10)

输出结果:

55

函数内的局部变量

可以在函数内定义局部变量,作用范围仅在当前函数内。

可以在递归函数中定义局部变量。

命令格式:

local 变量名=变量值

例如:

\#! /bin/bash

func() {
local name=yxc
echo \$name
}
func

echo \$name

输出结果:

yxc

第一行为函数内的name变量,第二行为函数外调用name变量,会发现此时该变量不存在。