Bashはデフォルトでは2次元配列をサポートしません。しかし、シミュレーションしたいと思います。最小限の作業例として、2つの配列があり、次のa0
ものがあるとしますa1
。
a0=(1 2 3 4)
a1=(5 6 7 8)
andの3番目の要素をfor
印刷するループを作成したいと思います。もちろん、2つの明示的な呼び出しを使用してこれを手動で実行できます。a0
a1
echo
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