2012-05-17 7 views
5

मैं एक स्क्रिप्ट है कि अधिक मूल्यों की एक सरणी, कुछ इस तरह (इस सवाल के प्रयोजनों के लिए नीचे dumbed) iterates है:बैश सरणी पर इटरेट, विकल्प सरणी नाम गतिशील रूप से, क्या यह संभव है?

COUNTRIES=(ENGLAND SCOTLAND WALES) 

for i in ${COUNTRIES[@]} 
do     
    echo "Country is $i " 
done 

मेरा प्रश्न है, यह गतिशील सरणी स्थानापन्न के लिए संभव है? उदाहरण के लिए, मैं रनटाइम पर फिर से चलाने के लिए सरणी में पास करने में सक्षम होना चाहता हूं। मैं निम्नलिखित की कोशिश की है, लेकिन मुझे लगता है कि मेरी वाक्य रचना गलत हो सकता है

COUNTRIES=(ENGLAND SCOTLAND WALES) 
ANIMALS=(COW SHEEP DOG) 

loopOverSomething() 
{ 
    for i in ${$1[@]} 
    do     
     echo "value is $i " 
    done 
} 

loopOverSomething $ANIMALS 

मैं line 22: ${$2[@]}: bad substitution

+1

+1 अच्छी तरह से कहा गया है और ध्यान केंद्रित समस्या के लिए, नमूना कोड और त्रुटि संदेश भी शामिल थे। सौभाग्य। – shellter

उत्तर

4

आप इस के लिए पार्टी के अप्रत्यक्ष विस्तार का उपयोग कर सकते हो रही है:

loopOverSomething() 
{ 
    looparray="$1[@]" 
    for i in "${!looparray}" 
    do 
     echo "value is $i" 
    done 
} 
+1

क्या आपने इसका परीक्षण किया? यह निश्चित रूप से बिल्कुल दिए गए काम नहीं करता है, और विषय पर BashFAQ प्रविष्टि इंगित करता है कि यह _won't_ नहीं है। –

+0

मैंने इसका परीक्षण किया ... और फिर जब मैंने इसे पोस्ट किया तो कॉपी-पेस्ट त्रुटि बना दी। अब तय किया जाना चाहिए। उद्धरणों का उपयोग न करने के लिए –

0

आप इस्तेमाल कर सकते हैं सरणी निम्न तरीके से तर्क के रूप में:

COUNTRIES=(ENGLAND SCOTLAND "NEW WALES") 
ANIMALS=(COW SHEEP DOG) 

loopOverSomething() 
{ 
    for i in "[email protected]" 
    do     
     echo "value is $i " 
    done 
} 

loopOverSomething "${ANIMALS[@]}" 
loopOverSomething "${COUNTRIES[@]}" 
+1

-1 - यदि 'देश = ("न्यू वेल्स" इंग्लैंड) '," नया "और" वेल्स "को अलग प्रविष्टियों के रूप में माना जाएगा। –

+0

@CharlesDuffy क्षमा करें, आप सही हैं। मैंने अभी ओपी के कोड की प्रतिलिपि बनाई है। – sgibb

0

यह 01 तक कवर किया गया है:

हम किसी भी चाल कि POSIX या बॉर्न गोले में है कि कार्यक्षमता (eval है, जो बहुत मुश्किल है का उपयोग कर सुरक्षित रूप से करने के लिए की कमी) नकल कर सकते हैं के बारे में पता नहीं कर रहे हैं। बैश लगभग यह कर सकता है - कुछ अप्रत्यक्ष सरणी काम करता है, और अन्य नहीं करते हैं, और हम नहीं जानते कि शामिल वाक्यविन्यास भविष्य में रिलीज में स्थिर रहेगा या नहीं। तो, इसे अपने जोखिम हैक पर उपयोग पर विचार करें।

# Bash -- trick #1. Seems to work in bash 2 and up. 
realarray=(...) ref=realarray; index=2 
tmp="$ref[$index]" 
echo "${!tmp}"   # gives array element [2] 

# Bash -- trick #2. Seems to work in bash 3 and up. 
# Does NOT work in bash 2.05b. 
tmp="$ref[@]" 
printf "<%s> " "${!tmp}"; echo # Iterate whole array. 
संबंधित मुद्दे