如果我将数组传递给函数:
func()
{
echo $1
echo $2
echo $3
}
myArray=("This" "Is" "An Array")
func "${myArray[@]}"
然后数组的每个元素将被传递给函数的单独参数。
有没有一种方法可以让函数的一个参数只接收整个数组?
答案1
你可以,某种程度上。 Bash 和 ksh93 有名称引用,有点像指针,允许您传递数组姓名到该函数,并从那里使用它,说:
#!/bin/bash
function byname {
typeset -n _p=$1
echo "second item of '$1' is ${_p[1]}"
echo "second arg to this function is \"$2\""
}
blah=(a b c)
byname blah "other arg"
尽管在 Bash 中,nameref 的名称(_p
此处)必须与其指向的变量的名称不同,因此它对于递归函数不太有用。在 ksh 中,它仅在 ksh 样式函数中使用相同的名称(function foo
而不是foo()
)。
正如标签所说,这是一个参考,不是副本,因此如果您在函数中修改数组,更改将显示在主程序中。
另一种更糟糕的选择是将数组连接到字符串,并将其作为变量传递:
function concated {
echo "the whole array is \"$1\""
}
concated "${blah[*]}"
但这基本上就违背了使用数组的初衷,除非您想出一些复杂的系统来进行数组到字符串的打包。
上面的调用当然会打印:
second item of 'blah' is b
second arg to this function is "other arg"
the whole array is "a b c"