能否将数组传递给函数,但只让函数的一个参数接收整个数组?

能否将数组传递给函数,但只让函数的一个参数接收整个数组?

如果我将数组传递给函数:

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"

相关内容