2014-12-13 28 views
2

在這個非常簡單的例子,我需要解決的陣列元件的兩個鍵和值:擊間接引用關聯數組

declare -A writer 
writer[H.P.]=Lovecraft 
writer[Stephen]=King 
writer[Clive]=Barker 
writer[Jack]=Ketchum 

for i in ${!writer[@]} 
do 
    echo "$i ${writer[$i]}" 
done 

fullname() 
{ 
    pointer=$1[@] 
    for i in "${!pointer}" 
    do 
     echo "? $i" 
    done 
} 
fullname writer 

該函數必須顯示相同的格式的輸出作爲示例環在它之前,它應該接收數組名稱,鍵或值的列表,我嘗試了所有這些,但沒有成功。任何建議,非常感謝。

回答

2
indir_keys() { 
    eval "echo \${!$1[@]}" 
} 

indir_val() { 
    eval "echo \${$1[$2]}" 
} 

fullname() 
{ 
    pointer=$1 
    for i in $(indir_keys $pointer) 
    do 
     echo "$i $(indir_val $pointer $i)" 
    done 
} 

給出:

Jack Ketchum 
Clive Barker 
Stephen King 
H.P. Lovecraft 
+2

通過驗證「$ 1」和「$ 2」是否僅僅是有效的標識符,可以使安全性更高,例如像[[$ 1 =〜[A-Za-z _] [A-Za- z0-9 _] +]] || return'。 – chepner 2014-12-14 15:31:29

0

Bash Reference Guide

執行一個shell函數時,位置參數被暫時代替(見Shell Functions)。

所以,你可以這樣做:

fullname() 
{ 
    for first 
    do 
     echo "$first ${writer[$first]}" 
    done 
} 
fullname "${!writer[@]}" 
12

由於猛砸4.3,declare有一個標誌-n定義引用(這是鬆散相當於在C++中的引用)。此標誌極大地簡化了在這裏你的問題:

fullname() { 
    declare -nl pointer="$1" 
    for i in "${!pointer[@]}" 
    do 
     echo "${pointer[$i]} $i" 
    done 
} 

,如果你在你的哈希鍵空格或有趣的符號(不同於接受的答案),這將是安全的。

+0

優秀的,不知道這個新功能+1這應該被接受的答案。 – anubhava 2014-12-14 03:11:39