将数组传递给函数的最正确方法是什么?

将数组传递给函数的最正确方法是什么?

考虑我有一个非常大的数组$large_list,有没有办法编写一个将数组作为参数的函数?例如:

echo_idx_array () {
    arr="$1"
    idx="$2"

    echo "${arr[$idx]}"
}

做这样的事情通常的策略是什么?我尝试给出变量$large_list,但它是空的。

我愿意修改该函数以使其适应参数列表中的任何更改。

作为记录,我正在使用 ksh88,并且我正在寻找尽可能便携的答案。


编辑:到目前为止,我能想到的最好方法是循环遍历数组并将每个元素作为参数发送给函数。这看起来非常丑陋并且容易出错,更不用说它肯定会很快达到某个极限。这就是我所做的:

foo () {
    echo $*
}

cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
    cmd="$cmd ${large_list[$i]}"
    ((i=i+1))
done

eval $cmd

难道没有更好的事可做吗?

答案1

要将数组元素作为参数传递给函数,请使用 ksh 语法将数组元素展开为列表。

work_on_array "${myarray[@]}"

后缀[@]使其成为数组扩展。双引号可保护每个元素免遭进一步扩展(拆分和通配符)。扩展的结果通常不是像通常使用双引号那样的一个单词,而是与数组中的元素一样多的单词。

那么数组的第一个元素就是。要访问它,您需要使用;看${N}eval在另一个变量“内部”使用变量引用

答案2

bash 4.3+ 中有一个方法,可能来自 ksh:

echo_idx_array () # array index
{
    local -n array=$1     # add nameref attribute
    local idx=$2
    echo "${array[idx]}"
}

$ names=(one two three four)
$ echo_idx_array names 2
three
$ days=([monday]=eggs [tuesday]=bread [sunday]=jam)    # associative array
$ echo_idx_array days sunday
jam

也可以看看declare -n

答案3

取决于 Korn Shell...最近的 AT&T ksh93 和 mksh 版本支持此功能:

function echo_idx_array {
    nameref arr=$1
    idx=$2

    echo "${arr[idx]}"
}

set -A test -- a b c
echo_idx_array test 1

在我当前的 shell 中,这确实输出“b”。

相关内容