如何将数组传递给函数,为什么这种方法不起作用?其他问题中的解决方案对我没有用。 记录一下,我不需要复制该数组,因此我不介意传递引用。我想要做的就是循环遍历它。
$ 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
#!/bin/bash
ar=( a b c )
test() {
local ref=$1[@]
echo ${!ref}
}
test ar
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
ar
不是测试的第一个参数 - 它是所有参数。你需要在函数中使用echo "$@"
。
for pkg in "${!ref}"
,否则循环将对数组元素中的空格(例如ar=(a "b c" d)
)非常脆弱。 - glenn jackman