如何将数组传递给bash函数

时间:2011-11-10 16:34:41

标签: arrays bash shell

如何将数组传递给函数,为什么这不起作用? 其他问题的解决方案对我不起作用。 为了记录,我不需要复制数组,所以我不介意传递引用。我想要做的就是循环它。

$ ar=(a b c)
$ function test() { echo ${1[@]}; }
$ echo ${ar[@]}
a b c
$ test $ar
bash: ${1[@]}: bad substitution
$ test ${ar[@]}
bash: ${1[@]}: bad substitution

3 个答案:

答案 0 :(得分:11)

#!/bin/bash
ar=( a b c )
test() {
    local ref=$1[@]
    echo ${!ref}
}

test ar

答案 1 :(得分:5)

我意识到这个问题已经差不多两年了,但它帮助我找出了原始问题的实际答案,上述答案实际上都没有(@ata和@ l0b0的答案)。问题是“如何将数组传递给bash函数?”,而@ata接近正确,他的方法最终没有在函数本身内使用的实际数组。需要一个小的补充。

所以,假设我们在调用函数anArray=(a b c d)之前的某个地方do_something_with_array(),这就是我们定义函数的方式:

function do_something_with_array {
    local tmp=$1[@]
    local arrArg=(${!tmp})

    echo ${#arrArg[*]}
    echo ${arrArg[3]}
}

现在

do_something_with_array anArray

会正确输出:

4
d

如果您的数组中的某些元素可能包含空格,则应将IFS设置为SPACE以外的值,然后在将函数的数组arg(s)复制到之后再返回本地数组。例如,使用以上内容:

local tmp=$1[@]
prevIFS=$IFS
IFS=,
local arrArg=(${!tmp})
IFS=$prevIFS

答案 2 :(得分:2)

ar不是第一个要测试的参数 - 它是 all 参数。你的功能必须echo "$@"