0

私は、いくつかの異なる配列からデータを取得する多くの機能を備えたスクリプトに取り組んでいます。レポート用に配列を個別に保持したいと考えています。配列内の情報は変更されず、各関数間で異なるのは、使用されている配列名だけです。すべての関数の内容は 98% が同じであるため、管理を簡素化するためにそれらを 1 つのアレイにまとめようとしています。

私が直面している問題は、関数の引数で渡される配列タイトルに基づいて配列の長さを取得するための正しい構文を理解できないことです。実際のスクリプトを投稿することはできませんが、ここに、私がテストしているものの簡略化されたバージョンの詳細を示すモックアップがあります. 以下のモック スクリプトを使用して動作させることができれば、必要な変更を実際のスクリプトに移すことができると思います。

array1=(
    "item1 123"
    "item2 456"
)

array2=(
    "stockA qwe"
    "stockB asd"
    "stockC zxc"
)

test() {
     local ref=${1}[@]
     IFS=$'\n'; for i in ${!ref}; do echo $i ; done
}

test array1
test array2

上記のスクリプトは、関数とその引数が呼び出されると、引数 1 に基づいて各配列行の内容をエコーし​​ます。必要に応じて機能しています。など、さまざまな組み合わせを試しましlen=${#${1}[@]}たが、常に「不適切な置換」エラーが発生します。前述の関数には while ループと、配列の長さを使用していつ停止するかを知る for ステートメントがあるため、その情報を引き出すことができるということは、すべてを結び付けることができます。私が望んでいるのは、以下の流れのようなものです

私はこれについて研究を続ける予定ですが、提供できる助けと知識に感謝します!

-シアン化物

4

1 に答える 1

0

唯一の解決策は、配列のコピーを作成し、その配列の長さを取ることだと思います:

local ref=${1}[@]
copy=( "${!ref}" )
len=${#copy[@]}

bashパラメータ展開演算子の連鎖が許可されていないため、同じ行で と の両方を使用するより短い方法はありません${#...}${!...}

于 2013-03-28T14:13:13.220 に答える