配列を関数に渡しますが、関数の1つのパラメータだけが配列全体を受け取るようにすることは可能ですか?

配列を関数に渡しますが、関数の1つのパラメータだけが配列全体を受け取るようにすることは可能ですか?

配列を関数に渡す場合:

func()
{
    echo $1
    echo $2
    echo $3
}

myArray=("This" "Is" "An Array")
func "${myArray[@]}"

これにより、配列の各要素が関数の別々のパラメータとして渡されます。

関数の1つのパラメータに配列全体のみを受け取る方法はありますか?

ベストアンサー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"

おすすめ記事