如何提供数组作为函数或脚本的位置参数?

如何提供数组作为函数或脚本的位置参数?

在我的脚本中,我发现数组上的一些操作是可重用的。所以我正在考虑将可重用的代码重构为函数或脚本。

但是,如何编写函数或脚本,以便可以提供数组作为函数或脚本的位置参数?或实现类似的目标?

谢谢。

答案1

在最新 (>=4.3) 版本中使用名称引用bash

foo () {
    local param1=$1
    local -n arr=$2

    printf 'array: %s\n' "${arr[@]}"
}

myarray=( some items go here )
foo something myarray

数组变量的名称作为第二个参数传递给函数。该函数声明一个接收该名称的名称引用变量。对该名称引用变量的任何访问都将访问其名称传递给函数的变量。

这显然适用于多个数组。

请注意,在上面的示例中,您不能将名为的变量传递arr给函数,因此必须小心以避免名称冲突ksh93也支持名称引用,但由于作用域不同而没有此问题)。


请注意,这种方法确实不是调用另一个 shell 脚本时起作用。当调用另一个 shell 脚本时,必须在该另一个脚本的命令行上传递该数组,这意味着它必须作为一组字符串传递。以这种方式传递单个数组相对容易,并且Hauke Laging 在他的回答中展示了如何做到这一点的基础知识

如果您可以完全控制数组的内容,则可以将它们的数据编码为单个字符串,方法可能是使用某些分隔符分隔它们的元素,然后在目标脚本中解析这些字符串以重新形成数组。另一种可能性是在脚本之间采用 JSON“接口”,这意味着您可以将数据编码为 JSON,将其传递到脚本标准输入(或类似输入),并使用jq.但这确实感觉相当麻烦,而且会增加巨大的开销。

答案2

my_func param1 param2 param2 after_this_the_array_values "${myarr[@]}"

my_func () {
    shift 4
    local array=("$@")
}

相关内容