2011-05-27 111 views
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 

輸出:

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

正如你可以看到試圖訪問$ TMP陣列的具體指標中的循環返回整個數組。

[Q]爲了分別訪問for循環中的$ TMP數組的「FNAME」和「LNAME」索引,我需要做些什麼?

謝謝。

回答

20

你不能做你想做什麼: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 

您可以假冒多維通過組成合適的數組索引字符串:

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

我試過你的解決方案,但這不是我所期待的,因爲當我循環$人時,我得到這4個元素以下命令:「1,LNAME = Andrew」,「2,FNAME = Elen」,「1,FNAME = John」和「2,LNAME - Murray」,我無法工作。對於bash爲什麼不支持多維數組,我仍然感到困惑。在一天結束時,我所做的就是將一個變量($ PERSON數組)賦值給一個數組元素($ PERSONS [「X」])。爲什麼這個變量i的類型很重要? bash是否檢查並防止將數組分配給數組元素? – Max 2011-05-27 12:07:41

+2

@ user359650,這是bash開發者的設計決定。引用了bash手冊中的內容:「Bash提供了一維索引和關聯數組變量。」你正在做的是將一個字符串(「John Andrew」)分配給一個數組索引。我認爲你需要再看看你在做什麼 - 如果你絕對必須擁有多維數組,那麼你使用的是錯誤的工具。 – 2011-05-27 13:10:48

+1

另外,關聯數組沒有特定的順序。 – 2011-05-28 00:01:59

-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

對不起我不不理解你的解決方案。我不想訪問$ PERSON數組,因爲一旦創建了$ PERSONS,它就不會再被訪問了。 – Max 2011-05-27 08:51:50

+0

道歉 - 我已閱讀我的解決方案和它的錯誤,我會回來它 – Raymondo 2011-05-27 09:09:07