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