簡體   English   中英

Bash腳本 - 通過“變量”變量名來迭代關聯數組列表

[英]Bash scripting - Iterating through “variable” variable names for a list of associative arrays

我有一個關聯數組的變量列表,我想迭代並檢索它們的鍵/值對。

我通過列出其所有鍵並獲取值來迭代單個關聯數組,即。

for key in "${!queue1[@]}" do
    echo "key : $key"
    echo "value : ${queue1[$key]}"
done

棘手的部分是關聯數組的名稱是變量變量,例如,給定count = 5,關聯數組將被命名為queue1,queue2,queue3,queue4,queue5。

我試圖根據計數替換上面的序列,但到目前為止,括號和eval的每個組合都沒有產生更多的錯誤替換錯誤。 例如下面:

for count in {1,2,3,4,5} do
    for key in "${!queue${count}[@]}" do
        echo "key : $key"
        echo "value : ${queue${count}[$key]}"
    done
done

非常感謝幫助!

這里的困難源於間接擴展( ${!nameref} )的語法與從關聯數組( ${!array[@]} )中提取鍵的語法沖突的事實。 我們只能有一個或另一個,而不是兩者。

我擔心使用eval ,我看不到使用它來提取間接引用的關聯數組的鍵的方法:

keyref="queue${count}[@]"
for key in $(eval echo '${!'$keyref'}'); do ... ; done

但是,在給定鍵的數組中提取值時,可以避免使用eval並使用間接擴展。 請注意, [key]后綴必須是擴展的一部分:

valref="queue${count}[$key]"
echo ${!valref}

把它放在上下文中:

for count in {1..5} ; do
    keyref="queue${count}[@]"
    for key in $(eval echo '${!'$keyref'}'); do
        valref="queue${count}[$key]"
        echo "key = $key"
        echo "value = ${!valref}"
    done
done

我能夠使用以下腳本:

for count in {1..5} ; do
    for key in $(eval echo '${!q'$count'[@]}') ; do
        eval echo '${q'$count"[$key]}"
    done
done

請注意,如果任何鍵包含空格,則會中斷。 如果您想處理復雜的數據結構,請使用更強大的語言,如Perl。

我認為這可能有效(但未經測試)。 關鍵是將索引視為變量的全名。 (也就是說,數組queue5可以被視為名為queue5[this]queue5[that]等的變量序列。)

for count in {1,2,3,4,5} do
    assoc="queue$count[@]"
    for key in "${!assoc}" do
        echo "key : $key"
        val="queue$count[$key]"
        echo "value : ${!val}"
    done
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM