![能否将数组传递给函数,但只让函数的一个参数接收整个数组?](https://linux22.com/image/126153/%E8%83%BD%E5%90%A6%E5%B0%86%E6%95%B0%E7%BB%84%E4%BC%A0%E9%80%92%E7%BB%99%E5%87%BD%E6%95%B0%EF%BC%8C%E4%BD%86%E5%8F%AA%E8%AE%A9%E5%87%BD%E6%95%B0%E7%9A%84%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%E6%8E%A5%E6%94%B6%E6%95%B4%E4%B8%AA%E6%95%B0%E7%BB%84%EF%BC%9F.png)
如果我将数组传递给函数:
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"