関数またはスクリプトの位置引数として配列を提供する方法は?

関数またはスクリプトの位置引数として配列を提供する方法は?

私はスクリプトが配列に対するいくつかの操作を再利用できることを発見しました。それで、再利用可能なコードを関数やスクリプトにリファクタリングしようとしています。

しかし、関数やスクリプトの位置引数として配列を提供できるように、関数やスクリプトをどのように記述しますか?それとも同様の目標を達成しますか?

ありがとうございます。

ベストアンサー1

最近のバージョン(> = 4.3)は名前参照を使用しますbash

foo () {
    local param1=$1
    local -n arr=$2

    printf 'array: %s\n' "${arr[@]}"
}

myarray=( some items go here )
foo something myarray

配列変数の名前は、2番目のパラメータとして関数に渡されます。この関数は、名前を受け取る名前参照変数を宣言します。その名前の参照変数へのすべてのアクセスは、名前が関数に渡された変数にアクセスします。

これは明らかに複数の配列で機能します。

上記の例では、名前付き変数をarr関数に渡すことはできないので注意してください。名前の衝突を避けるためにksh93名前参照もサポートされていますが、範囲が異なるため、この問題は発生しません。)


このアプローチはいいえ他のシェルスクリプトを呼び出すと機能します。別のシェルスクリプトを呼び出すとき、配列は他のスクリプトのコマンドラインから渡されなければなりません。これは、配列を文字列セットとして渡す必要があることを意味します。この方法で単一の配列を渡すのは比較的簡単です。Hauke Lagingは、彼の答えでこれを行う方法の基本を示しています。

配列の内容を完全に制御できる場合は、要素を区切り文字で区切ってデータを単一の文字列にエンコードし、ターゲットスクリプトでこれらの文字列を解析して配列を再構築できます。もう1つの可能性は、スクリプト間でJSON "インターフェース"を使用することです。つまり、データをJSONにエンコードし、それをスクリプトの標準入力(または類似)に渡してからjq。間接費。

おすすめ記事