在我的脚本中,我发现数组上的一些操作是可重用的。所以我正在考虑将可重用的代码重构为函数或脚本。
但是,如何编写函数或脚本,以便可以提供数组作为函数或脚本的位置参数?或实现类似的目标?
谢谢。
答案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=("$@")
}