2010-04-14 13 views
17
x=1 
c1=string1 
c2=string2 
c3=string3 

echo $c1 
string1 

मेरे पास करने के लिए उत्पादन कुछ का उपयोग करके string1 हो की तरह चाहते हैं: echo $(c($x))एक चर का उपयोग करना बैश में एक और चर का उल्लेख करने के

तो बाद में लिपि में मैं x का मूल्य बढ़ाने के कर सकते हैं और इसे string1 आउटपुट करें, फिर string2 और string3

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

+1

एक सरणी का उपयोग करें। 'मैन बाश' पढ़ें। –

+0

मेरे पास एक ही सवाल था। – User1

+0

देखें [बैश में अप्रत्यक्ष चर] [https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean) भी। – codeforester

उत्तर

22

देखें बैश पूछे जाने वाले प्रश्न है

realvariable=contents 
ref=realvariable 
echo "${!ref}" # prints the contents of the real variable 

कैसे इस के लिए उपयोगी है दिखाने के लिए अपने उदाहरण:

get_c() { local tmp; tmp="c$x"; printf %s "${!tmp}"; } 
x=1 
c1=string1 
c2=string2 
c3=string3 
echo "$(get_c)" 

हैं, तो निश्चित रूप से, आप यह कर के लिए सही रास्ता चाहते हैं और सिर्फ use an array:

c=("string1" "string2" "string3") 
x=1 
echo "${c[$x]}" 

ध्यान दें कि इन सरणियों शून्य अनुक्रमित, तो x=1 साथ यह string2 प्रिंट कर रहे हैं; यदि आप string1 चाहते हैं, तो आपको x=0 की आवश्यकता होगी।

+0

उत्कृष्ट। आपके संपादन के बाद यह क्रिस्टल स्पष्ट और मेरी पसंदीदा पसंद बन जाती है। आपके समय और ज्ञान के लिए बहुत बहुत धन्यवाद। – user316100

2

यदि आपके पास बैश 4.0 है, तो आप associative arrays. का उपयोग कर सकते हैं। या आप बस arrays का उपयोग कर सकते हैं। How can I use variable variables (indirect variables, pointers, references) or associative arrays?

उनके उदाहरण के शब्दों में: एक अन्य उपकरण आप उपयोग कर सकते awk

जैसे

awk 'BEGIN{ 
    c[1]="string1" 
    c[2]="string2" 
    c[3]="string3" 
    for(x=1;x<=3;x++){ 
    print c[x] 
    } 
}' 
1

इस प्रयास करें:

eval echo \$c$x 

की तरह अन्य लोगों ने कहा, यह अधिक समझ में आता है कि इस मामले में सरणी का उपयोग करें।

+1

उपयुक्त उद्धरण के बिना eval का उपयोग करना (जैसा कि 'printf% q' के साथ) सुरक्षा परिप्रेक्ष्य से काफी खतरनाक है, खासकर यदि आपकी स्क्रिप्ट किसी भी डेटा को संभालने वाली है जो संभावित रूप से दुर्भावनापूर्ण या अविश्वसनीय प्रक्रियाओं द्वारा बनाई जा सकती है। (यहां तक ​​कि एक फ़ाइल नाम का उपयोग दुर्भावनापूर्ण सामग्री को इंजेक्ट करने के लिए भी किया जा सकता है, अगर आप उस पर लूपिंग कर रहे थे)। –

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