2012-11-09 20 views
6

की सूची के लिए "वेरिएबल" वेरिएबल नामों के माध्यम से Iterating मुझे सहयोगी सरणी की एक चर सूची मिली है जिसे मैं फिर से चालू करना चाहता हूं और उनके कुंजी/मूल्य जोड़े को पुनर्प्राप्त करना चाहता हूं।बैश स्क्रिप्टिंग - सहयोगी सरणी

मैं अपनी सभी चाबियों को सूचीबद्ध करके और मूल्यों को प्राप्त करके एक ही सहयोगी सरणी के माध्यम से पुनरावृत्ति करता हूं, यानी।

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

मुश्किल हिस्सा यह है कि एसोसिएटिव सरणी के नाम परिवर्तनीय चर हैं, उदा। दी गई गिनती = 5, एसोसिएटिव सरणी को क्यूई 1, क्यूई 2, क्यूई 3, क्यूई 4, क्यूई 5 नाम दिया जाएगा।

मैं गिनती के आधार पर उपरोक्त अनुक्रम को प्रतिस्थापित करने की कोशिश कर रहा हूं, लेकिन अब तक कोष्ठक और 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 

सहायता बहुत सराहना की जाएगी!

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

नोट यह टूट जाता है किसी भी कुंजी एक अंतरिक्ष निहित यदि:

+0

( आदि queue5[this] नामित चर का एक अनुक्रम, queue5[that], के रूप में इलाज यही है, सरणी queue5 जा सकता है) मौजूदा जवाब बैश 4.3 में namevar समर्थन के संदर्भ में काफी हद तक बाहर के तारीख कर रहे हैं (और बादमें)। –

उत्तर

3

यहां कठिनाई इस तथ्य से उत्पन्न होती है कि अप्रत्यक्ष विस्तार (${!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 
+0

पर स्पॉट! जानकारीपूर्ण स्पष्टीकरण के लिए ++। धन्यवाद! – Indecided

1

मैं इसे निम्न स्क्रिप्ट के साथ काम करने के लिए सक्षम था। यदि आप जटिल डेटा संरचनाओं से निपटना चाहते हैं, तो पर्ल जैसे अधिक शक्तिशाली भाषा का उपयोग करें।

0

मुझे लगता है कि यह काम (लेकिन अपरीक्षित) हो सकता है। एक चर के पूर्ण नाम के रूप में इंडेक्सिंग का इलाज करना महत्वपूर्ण है।

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 
+0

यह सरणी में मानों के माध्यम से पुनरावर्तित प्रतीत होता है (सरणी में कुंजी के बजाय)। मुझे लगता है कि आप कुछ काम के साथ मूल्य का उपयोग कर कुंजी खोद सकते हैं, लेकिन गैर-अद्वितीय मानों में कोई समस्या हो सकती है। – doubleDown

+0

अप्रत्यक्ष संदर्भ सरणी मानों तक पहुंचने के लिए काम करता है लेकिन चाबियों के लिए नहीं। विवरण के लिए मेरा जवाब देखें। –

संबंधित मुद्दे