如何将数组传递给Bash函数

13

如何将数组传递给函数,为什么这种方法不起作用?其他问题中的解决方案对我没有用。 记录一下,我不需要复制该数组,因此我不介意传递引用。我想要做的就是循环遍历它。

$ 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个回答

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

test ar

好的,这个可以运行:test() { local ref=$1[@] for pkg in ${!ref}; do echo "1 $pkg 2" done }ar=( a b c ) test ar - johndir
2
请使用for pkg in "${!ref}",否则循环将对数组元素中的空格(例如ar=(a "b c" d))非常脆弱。 - glenn jackman

6
我知道这个问题已经有将近两年的历史了,但它帮助我找到了原始问题的实际答案,而上面的回答(@ata和@l0b0)并没有真正解决问题。原问题是“如何将数组传递给bash函数?”,虽然@ata接近正确,但他的方法并不能得到一个可以在函数内部使用的实际数组。需要做出一点小修改。
因此,假设我们在调用函数do_something_with_array()之前已经定义了anArray=(a b c d),这就是我们如何定义函数的方式:
function do_something_with_array {
    local tmp=$1[@]
    local arrArg=(${!tmp})

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

现在
do_something_with_array anArray

将正确输出:

4
d

如果你的数组中可能含有空格,那么你需要将 IFS 设置为除了空格之外的其他值,在将函数的数组参数复制到本地数组之后再设置回去。例如,使用上面的代码:

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

2
< p > ar 不是测试的第一个参数 - 它是所有参数。你需要在函数中使用echo "$@"


好吧,这不是我最初想要的,但它确实解决了问题:test() { for var in "$@"; do echo "1 $var 2" done }ar=(a b c) test ${ar[@]} - johndir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接