一、函数的用法

1. 概念

在 shell 中,函数是一个命名的代码块,可以定义一次并多次调用。它类似于脚本中的“子程序”,可以接受输入参数、执行操作,并返回结果。函数的主要优点包括:

代码重用:避免重复编写相同逻辑

模块化:将复杂任务分解为更小的单元

作用域控制:通过局部变量管理数据范围

2. shell 函数定义方法

在 shell 脚本中,定义函数有两种常见方式:

使用 function 关键字:语法为 function 函数名() { ... }

直接使用函数名:语法为 函数名() { ... }。在 Bash 中推荐使用

3. 函数调用的方法

直接调用:只需在脚本中使用函数名,如 函数名

传递参数:调用时可以在函数名后添加参数,如 函数名 参数1 参数2

返回值:函数可以通过return语句返回退出状态(0表示成功,非0表示错误),或使用 echo 输出值

4. 函数的定义与调用示例

以下是一个完整的 shell 脚本示例,展示如何定义和调用一个函数。该函数用于计算两个数的和

#!/bin/bash

# 定义函数:add
add() {
    local sum=$(( $1 + $2 ))  # 使用 local 声明局部变量
    echo "和为:$sum"         # 输出结果
    return 0                 # 返回成功状态
}

# 调用函数
add 5 3

# 另一个调用示例
add 10 20

定义:函数 add 使用直接定义方式,接受两个参数 $1$2,计算它们的和

调用add 5 3 传递参数 5 和 3,输出 "和为:8"

返回值return0表示函数执行成功,但实际输出通过echo实现

运行此脚本时,输出为:

和为:8
和为:30

二、函数变量的作用范围

1.概念

在 shell 函数中,变量的作用范围控制着变量的可见性和生命周期:

全局变量:默认情况下,在函数外部定义的变量是全局的,可以在函数内部访问和修改

局部变量:在函数内部使用local关键字声明的变量是局部的,只在函数内部有效,不会影响外部同名变量

最佳实践:推荐在函数内使用local声明变量,避免意外修改全局状态

2.local命令使用示例

#!/bin/bash

global_var="全局"  # 全局变量

myfunc() {
    local local_var="局部"  # 局部变量
    echo "函数内:global_var=$global_var, local_var=$local_var"
    global_var="已修改"     # 修改全局变量
}

echo "调用前:global_var=$global_var"
myfunc
echo "调用后:global_var=$global_var"

输出

调用前:global_var=全局
函数内:global_var=全局, local_var=局部
调用后:global_var=已修改

三、函数的参数

1.函数参数用法

函数可以接受参数,用于传递数据:

位置参数:在函数内部,通过 $1, $2, $3 等访问传递的参数,其中 $1 是第一个参数,$2 是第二个,以此类推

特殊参数:

$#:参数个数

$@$*:所有参数的列表

$0:函数名

参数传递:调用函数时,参数以空格分隔传

默认值:shell 不支持直接默认值,但可以通过条件判断模拟

2.函数参数应用示例

#!/bin/bash

# 定义函数:打印参数信息
print_params() {
    echo "函数名:$0"
    echo "参数个数:$#"
    echo "第一个参数:$1"
    echo "所有参数:$@"
}

# 调用函数,传递多个参数
print_params "参数A" "参数B" "参数C"

输出

函数名:print_params
参数个数:3
第一个参数:参数A
所有参数:参数A 参数B 参数C

四、递归函数

1.概念

递归函数是指函数调用自身的过程,常用于解决分治问题(如阶乘、遍历目录)。在 shell 中,递归函数需要:

退出条件:必须有一个条件来终止递归,避免无限循环

参数传递:每次递归时传递更新后的参数

注意点:shell 的递归深度有限制,需谨慎使用

2.计算阶乘的递归函数示例

#!/bin/bash

# 定义递归函数:factorial
factorial() {
    local n=$1
    if [ $n -le 1 ]; then  # 退出条件:n <= 1
        echo 1
        return 0
    else
        local prev=$(factorial $((n - 1)))  # 递归调用
        echo $((n * prev))  # 返回当前结果
    fi
}

# 调用函数,计算 5 的阶乘
result=$(factorial 5)
echo "5! = $result"

输出

5! = 120

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐