2017-09-15 83 views
1

說我有Bash中循環了兩個關聯數組

declare -A a 
declare -A b 
a[xz]=1 
b[xz]=2 
a[zx]=3 
b[zx]=4 

兩種締陣列我想要做這樣的事情

for arr in ${a[@]} ${b[@]}; do echo ${arr[zx]}; done 

,並在輸出得到3和4

但我得到

$ for arr in ${a[@]} ${b[@]}; do echo ${arr[zx]}; done 
1 
3 
2 
4 

有沒有辦法在Bash中做到這一點?

回答

1

你不想遍歷內容;你想遍歷數組的名稱,然後使用間接擴展從每個數組中獲得所需的固定鍵值。

for arr in a b; do 
    t=$arr[zx] # first a[zx], then b[zx] 
    printf '%s\n' "${!t}" 
done 

這裏,用於間接擴展的變量「名稱」是數組的名稱以及所需的索引。

+0

是的,這正是我正在尋找的,但它工作嗎? $ for a arr in a b; do t = arr [zx]; printf'%s \ n'「$ {!t}」;完成 a b –

+0

如果你解決了我的愚蠢錯誤('arr'需要在設置't'時需要擴展),它才能工作。 – chepner

+0

@chepner:可能我在這裏錯過了一個觀點,但對於像xz這樣的其他指標? – Inian

1

假設兩個數組中的鍵匹配(一個主要假設),您可以使用一個數組作爲參考並循環遍歷鍵並在每個數組中打印。

for key in "${!a[@]}"; do 
    printf "Array-1(%s) %s Array-2(%s) %s\n" "$key" "${a[$key]}" "$key" "${b[$key]}" 
done 

它產生如下輸出。您當然可以刪除僅用於理解目的而添加的花式調試字(Array-1Array-2)。

Array-1(xz) 1 Array-2(xz) 2 
Array-1(zx) 3 Array-2(zx) 4 

一個一般好的做法是總是報價(for key in "${!a[@]}")在bash你的陣列擴展,使元件不被殼經歷字分裂。

+1

是的,我想這會做的伎倆。謝謝。 –