forループを使用してbash内の複数の配列を巡回する

forループを使用してbash内の複数の配列を巡回する

Bashはデフォルトでは2次元配列をサポートしません。しかし、シミュレーションしたいと思います。最小限の作業例として、2つの配列があり、次のa0ものがあるとしますa1

a0=(1 2 3 4)
a1=(5 6 7 8)

andの3番目の要素をfor印刷するループを作成したいと思います。もちろん、2つの明示的な呼び出しを使用してこれを手動で実行できます。a0a1echo

echo ${a0[2]}
echo ${a1[2]}

しかし、私はforこれをループを使って要約したいと思います。どうすればいいですか?

私は以下を試しました:

for i in ${a0[@]} ${a1[@]}
do
echo {$i}[2]
echo ${i[2]}
echo ${i}[2]
echo ${$i[2]}
echo ${${i}[2]}
done

しかし、これらの試みは成功しませんでした。私は次のような結果を得ます。

{1}[2]

1[2]
chgreen.sh: line 30: ${$i[2]}: bad substitution

どんな考えがありますか?

答え1

あなたは間違ったことを繰り返しています。for配列の各要素を$i配列のインデックスではなくとして格納します。あなたが望むものは次のとおりです

#!/usr/bin/env bash
a0=(1 2 3 4)
a1=(5 6 7 8)

for ((i=0;i<${#a0[@]};i++))
do
    echo ${a0[$i]} ${a1[$i]};
done

答え2

今までの研究でわかるように、bashは多次元配列をサポートしていません。それ自体しかし、「関連付け」配列をサポートします。デフォルトでは、数値ではなく文字列でインデックスが作成されるため、たとえば、次のような結果が得られます。

grade[John]=100
grade[Paul]=100
grade[George]=90
grade[Ringo]=80

リンクされた質問に対する回答で実証されているがよく説明されていませんが、連想配列のインデックスにカンマを含めることができるため、一般的なトリックは個々のインデックス(0-1×0-3)をリンクすることです。カンマで区切られた文字列。これは通常の配列よりも面倒ですが、次のように機能します。

$statement-A              <--関連配列を生成します。
$a[0,0]=1
$a[0,1]=2
$a[0,2]=3
$a[0,3]=4
$a[1,0]=5
$a[1,1]=6
$a[1,2]=7
$a[1,3]=8
$は0 1内に私はありますか?
>する
> エコ ${a[$i,2]}
>完了
サム                           <-- これが出力です。
7

答え3

これは奇妙なアプローチですが、状況によっては役に立ちます。問題は、forループが配列を対応する要素に解析し、各要素を個別に処理することです。

したがって、配列を解体して再作成します。

a0=(1 2 3 4)
a1=(5 6 7 8)
a0=${a0[@]}  # deconstruction
a1=${a1[@]}
for arr in "$a0" "$a1"; do a=( $arr ); echo ${a[2]}; done

出力

サム

7

関連情報