您的位置:

编写可以接收参数的shell函数

一、Shell函数介绍

Shell 是一种命令语言,也是一种脚本语言,Linux下常用的Shell有Bash、Zsh等。Shell 函数是一段可以重复调用的代码块,在Shell 命令和程序中通常用来实现一系列任务。函数可以接受参数,在函数内部可以使用这些参数进行操作并返回结果。在Shell 脚本编程中,函数可以提高程序代码的复用性,使我们更加高效的实现我们的编程任务。

二、Shell函数的定义及调用

Shell 函数的定义格式如下:

函数名()
{
    shell 代码块
}

函数名可以自定义,函数体内的代码块可以是任何合法的Shell 逻辑代码,包括流程控制语句、命令调用、变量赋值等操作。在Shell 脚本中,函数的调用方式和常规函数调用方式相同,只需要通过函数名来调用该函数即可。

函数名 参数1 参数2 ...

三、参数传递的方式

Shell 函数中支持通过参数传递的方式来传递外部数据,这样可以使函数具有更加通用性。

1. 位置参数

在函数定义中,$1、$2、$3 等表示第 1、2、3 个参数。如果冒号后面有数字,如 $5,则表示第五个参数。在函数调用中,函数名后面的参数按位置传递,第一个参数是 $1,第二个参数是 $2,以此类推。下面是一个简单的例子,该函数将两个数字相加,并输出结果:

add(){
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is $sum"
}

add 10 20

该函数会输出:

The sum of 10 and 20 is 30

2. 特殊参数

除了位置参数之外,Shell 函数还支持一些特殊参数:

  • $# 表示传入参数的总数
  • $0 表示脚本或函数名本身
  • $* 表示所有参数以一个字符串的形式传递,各个参数由空格分隔
  • $@ 表示所有参数以一个字符串的形式传递,各个参数由特殊字符分隔。特殊字符可以通过 IFS 环境变量来指定,默认是空格字符

下面是一个使用 $* 和 $@ 参数的例子:

print_args(){
    echo "Number of arguments: $#"
    echo "Arguments using *: $*"
    echo "Arguments using @: $@"
}

args=("hello" "world" "how" "are" "you")
print_args "${args[@]}"

该函数调用会输出:

Number of arguments: 5
Arguments using *: hello world how are you
Arguments using @: hello world how are you

四、示例

下面是一个综合使用了函数定义、参数传递和特殊参数的案例,该函数可以列出指定目录下的所有文件和目录,也可以列出子目录中的所有内容:

list(){
    local dir=$1
    local depth=${2:-0}
    local padding=$(printf "%${depth}s")

    for file in "$dir/"*
    do
        [ -e "$file" ] || continue
        echo "${padding}-${file##*/}"
        [ -d "$file" ] && list "$file" $(($depth+1))
    done
}

list "/etc" 2

该函数调用会输出目录 /etc 下面深度为 2 的所有文件和目录:

-/etc/acpi
-/etc/adduser.conf
-/etc/alchemist
-/etc/apparmor
-/etc/apport
...

总结

Shell 函数的参数传递非常灵活,通过合理地使用函数参数,可以使编程过程变得更简单和高效。在编写 Shell脚本时,需要在代码复用和执行效率之间取得平衡,使用函数是一个非常好的方式来达到这个目的。