2010-06-24 16 views
224

में सहयोगी सरणी पर पुनरावृत्ति कैसे करें बैश स्क्रिप्ट में एक सहयोगी सरणी के आधार पर, मुझे कुंजी और मूल्य प्राप्त करने के लिए इसे फिर से चालू करने की आवश्यकता है।बैश

#!/bin/bash 

declare -A array 
array[foo]=bar 
array[bar]=foo 

मुझे वास्तव में समझ में नहीं आता कि फॉर-इन लूप का उपयोग करते समय कुंजी कैसे प्राप्त करें।

+6

$ घोषित -एक सरणी = ([foo] = बार [बार] = foo) # बिल्कुल Initialise एक बार – anisbet

+2

प्रमुख मूल्यों की एक छोटी सूची के लिए आप इस पर विचार कर सकते हैं: 'मैं में, बी c_s, डी; कुंजी = $ {i%, *} करें; VAL = $ {मैं # *,}; $ कुंजी "एक्सएक्स" $ VAL गूंजें; किया गया – math

उत्तर

400

कुंजी एक विस्मयादिबोधक बिंदु का उपयोग कर पहुंचा जा सकता है मूल्य${array[@]} का उपयोग कर उपयोग किया जाता है। for बयान में चर-पीछे उद्धरण चिह्न के उपयोग (प्लस @ बजाय * के उपयोग)

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

नोट:

आप इस तरह कुंजी/मान जोड़े से अधिक पुनरावृति कर सकते हैं। किसी भी कुंजी में रिक्त स्थान शामिल होने पर यह आवश्यक है।

दूसरे उत्तर में भ्रम इस तथ्य से आता है कि आपके प्रश्न में और दोनों मानों के लिए "foo" और "bar" शामिल है।

+2

यह अब है यदि किसी सरणी को सभी कुंजी असाइन करें: 'array = ($ {! हैश [@]}) ' –

+7

@ माइकल-ओ: आपको चाहिए व्हाइटस्पेस वाले कुंजी की सुरक्षा के लिए पैरामीटर विस्तार को उद्धृत करने के लिए: 'array = (" $ {! हैश [@]} ")' –

+0

@ डेनिसविल्लियमसन, बहुत बहुत धन्यवाद। मेरे पास यह मेरे दिमाग में नहीं था। –

35

आप ${!array[@]} साथ कुंजी का उपयोग कर सकते हैं:, ${!array[@]}:

bash-4.0$ echo "${!array[@]}" 
foo bar 

फिर, कुंजी/मान जोड़े से अधिक पुनरावृत्ति आसान है:

for i in "${!array[@]}" 
do 
    echo "key :" $i 
    echo "value:" ${array[$i]} 
done 
+0

सही - धन्यवाद! – pex

+1

मेरे पास "!" था - यह भी ध्यान नहीं दिया, कोई नहीं था, क्षमा करें .. :) – pex

4

उपयोग इस उच्च आदेश समारोह pyramid of doom

foreach(){ 
    arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; 
    for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done 
} 

उदाहरण को रोकने के लिए:

$ bar(){ echo "$1 -> $2"; } 
$ declare -A foo["flap"]="three four" foo["flop"]="one two" 
$ foreach foo bar 
flap -> three four 
flop -> one two 
+1

मुझे यकीन नहीं है कि यह कैसे लागू है? विनाश का पिरामिड पूरी तरह से सौंदर्य संबंधी मुद्दा नहीं है और वास्तव में केवल ऑब्जेक्ट उन्मुख भाषाओं में लागू होता है? –

+1

क्या आप इसे समझा सकते हैं? Foreach समारोह थोड़ा मुश्किल है। मुझे यह नहीं मिला। –