12

多次元連想配列を作成しようとしていますが、何か助けが必要です。私はthe page suggested in this SO answerを見直しましたが、それは私をさらに混乱させました。これまでのところ、ここで私が持っているものです。BASH:多次元連想配列の助けが必要

スクリプト:

#!/bin/bash 
declare -A PERSONS 
declare -A PERSON 
PERSON["FNAME"]='John' 
PERSON["LNAME"]='Andrew' 
PERSONS["1"]=${PERSON[@]} 
PERSON["FNAME"]='Elen' 
PERSON["LNAME"]='Murray' 
PERSONS["2"]=${PERSON[@]} 
for KEY in "${!PERSONS[@]}"; do 
TMP="${PERSONS["$KEY"]}" 
echo "$KEY - $TMP" 
echo "${TMP["FNAME"]}" 
echo "${TMP["LNAME"]}" 
done 

出力:あなたのために$ TMP配列の特定のインデックスにアクセスしようとして見ることができるように

1 - John Andrew 
John Andrew 
John Andrew 
2 - Elen Murray 
Elen Murray 
Elen Murray 

ループは配列全体を返します。

[Q] forループ内の$ TMP配列の "FNAME"インデックスと "LNAME"インデックスに別々にアクセスするにはどうすればよいですか?

ありがとうございました。

答えて

20

あなたが何をしようとして行うことはできません。

declare -A PERSONS 
declare -A PERSON 

PERSON["FNAME"]='John' 
PERSON["LNAME"]='Andrew' 
i=1 
for key in "${!PERSON[@]}"; do 
    PERSONS[$i,$key]=${PERSON[$key]} 
done 

PERSON["FNAME"]='Elen' 
PERSON["LNAME"]='Murray' 
((i++)) 
for key in "${!PERSON[@]}"; do 
    PERSONS[$i,$key]=${PERSON[$key]} 
done 

declare -p PERSONS 
# ==> declare -A PERSONS='([1,LNAME]="Andrew" [2,FNAME]="Elen" [1,FNAME]="John" [2,LNAME]="Murray")' 
+0

私はあなたのソリューションを試しましたが、それは私が$人をループするときに探していたものではありません。 「1、LNAME = Andrew」、「2、FNAME = Elen」、「1、FNAME = John」、および「2、LNAME-Murray」の順番で実行されます。なぜbashが多次元配列をサポートできないのか、私はまだ困惑しています。私がやっていることは、変数($ PERSON配列)を配列要素($ PERSONS ["X"])に割り当てることです。なぜこの変数iのタイプが重要なのでしょうか? bashチェックをして配列を配列要素に割り当てるのを防ぎますか? – Max

+2

@ user359650、これはbash開発者の設計上の決定です。 bashのマニュアルから引用すると、「Bashは一次元の索引付きおよび連想配列変数を提供しています。」あなたがしているのは、配列インデックスに文字列( "John Andrew")を割り当てることです。私はあなたが何をやっているのかをもう一度見直す必要があると思います。多次元配列を絶対に必要とするならば、間違ったツールを使って作業しています。 –

+1

また、連想配列には特別な順序はありません。 –

-2
#!/bin/bash 
declare -A PERSONS 
declare -A PERSON 
PERSON["FNAME"]='John' 
PERSON["LNAME"]='Andrew' 
PERSONS["1"]=${PERSON[@]} 
PERSON["FNAME"]='Elen' 
PERSON["LNAME"]='Murray' 
PERSONS["2"]=${PERSON[@]} 
for KEY in "${!PERSONS[@]}"; do 
TMP="${PERSONS["$KEY"]}" 
echo "$KEY - $TMP" 
**echo "${PERSON["FNAME"]}" 
echo "${PERSON["LNAME"]}**" 
done 

別個の名の元の配列はまだアクティブであり、それは依然としてforループ内で参照することができるので。

+0

申し訳ありませんが、私ドン:bash arraysあなたは、適切な配列のインデックスの文字列を構成することにより、偽の多次元性をすることができ、一次元

$ declare -A PERSONS $ declare -A PERSON $ PERSON["FNAME"]='John' $ PERSON["LNAME"]='Andrew' $ declare -p PERSON declare -A PERSON='([FNAME]="John" [LNAME]="Andrew")' $ PERSONS[1]=([FNAME]="John" [LNAME]="Andrew") bash: PERSONS[1]: cannot assign list to array member 

ですあなたの解決策を理解していない。一旦$ PERSONSが作成されると、もはやアクセスするつもりはないので、$ PERSON配列にアクセスしたくありません。 – Max

+0

申し訳ありません - 私の解決策とその間違いを読んだことがあります。後で戻ってきます – Raymondo