web-dev-qa-db-ja.com

配列を関数に渡す最も正しい方法は何ですか?

非常に大きな配列$large_list、配列を引数としてとる関数を書く方法はありますか?例えば:

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

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

そのようなことをするための通常の戦略は何ですか?変数$large_listが空でした。

関数を変更して、引数リストの変更に適応させます。

記録のために、私はksh88を使用しており、可能な限りポータブルな答えを探しています。


[〜#〜] edit [〜#〜]:これまでのところ、私が思いつく最善の方法は、配列をループして各要素を関数の引数として送信することです。これは信じられないほど醜く、エラーが発生しやすいようです。言うまでもなく、すぐに制限に達します。これが私がしたことです:

foo () {
    echo $*
}

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

eval $cmd

何か良いことはありませんか?

8
rahmu

配列要素を引数として関数に渡すには、ksh構文を使用して配列の要素をリストとして展開します。

work_on_array "${myarray[@]}"

[@]サフィックスは、これを配列の拡張にします。二重引用符は、各要素がさらに拡張されないように保護します(分割およびグロビング)。展開の結果は通常、通常は二重引用符で囲まれているような1つの単語ではなく、配列内の要素と同じ数の単語です。

配列の[〜#〜] n [〜#〜]番目の要素は${N}。これにアクセスするには、evalを使用する必要があります。参照 別の変数の「内部」で変数参照を使用

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もご覧ください。

4
Edouard Thiel

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

私の現在のシェルでは、これは「b」を出力します。

1
mirabilos