Linux Bash将函数参数传递给数组名

时间:2013-03-28 14:07:47

标签: arrays bash function arguments

我正在开发一个脚本,它具有许多功能,可以从几个不同的数组中提取数据。我们希望将阵列保持个性化以用于报告目的。数组中的信息不会改变,每个函数之间唯一不同的是使用哪个数组名称。由于所有功能都有98%的内容相同,我试图将它们分成1个单独的阵列以简化管理。

我面临的问题是,我无法根据函数参数中传递的数组标题找出正确的语法来获取数组的长度。我无法发布实际的脚本,但这里是一个模拟,详细说明了我正在测试的简化版本。我相信如果我们可以使用下面的模拟脚本让它工作,我可以将所需的更改传递给实际的脚本。

array1=(
    "item1 123"
    "item2 456"
)

array2=(
    "stockA qwe"
    "stockB asd"
    "stockC zxc"
)

test() {
     local ref=${1}[@]
     IFS=$'\n'; for i in ${!ref}; do echo $i ; done
}

test array1
test array2

到目前为止,上面的脚本将在调用函数及其参数时基于参数1回显每个数组行的内容;这是根据需要工作。我尝试了许多不同的组合,例如len=${#${1}[@]},但我总是收到“错误替换”错误。我之前提到的函数有while循环和使用数组长度的语句知道何时停止,因此能够拉动该信息真正将它们联系在一起。我希望的是类似下面的流程

我计划继续对此进行研究,但感谢您提供的任何帮助和知识!

-Cyanide

1 个答案:

答案 0 :(得分:0)

我认为唯一的解决方案是创建数组的副本,然后获取该数组的长度:

local ref=${1}[@]
copy=( "${!ref}" )
len=${#copy[@]}

由于bash不允许链接参数扩展运算符,因此我知道在同一行上同时使用${#...}${!...}的方法并不简短。