2014-09-07 4 views
5

में परिवर्तनीय नाम के हिस्से के रूप में चर का उपयोग करना मैं चर को a_${v} के रूप में नामित करना चाहता हूं।यूनिक्स

उदाहरण के लिए

: वी 2013 2014

मैं अब a_${v}

a_${v}=hI # a_2013 should be Hi 

v=2014 

करने के लिए एक चर घोषणा कर रहा हूँ तो a_${v}=Hello # a_2014 हैलो

होना चाहिए मैं हालांकि यह फेंक नहीं है eval आदेश का उपयोग करने की कोशिश की हो सकती है एक मान निर्दिष्ट करते समय त्रुटि लेकिन मैं परिवर्तनीय नाम के मूल्य को निकालने में सक्षम नहीं हूं

$ v=2013 

$ eval a_${v}=Hi 


$ v=2014 

$ eval a_${v}=Hello 

echo ${a_${v}} 

काम कर रहा है नहीं .. :(

मैं पार्टी का उपयोग कर रहा हूँ और मैं चर नाम यानी dn't बदलने के लिए नहीं करना चाहती बैश में आप कर सकते हैं एक और मूल्य

+0

आप मार का उपयोग कर रहे हैं? – anubhava

+0

@ Pumbaa80 प्रश्न (और इसका उत्तर) आप उद्धरण देते हैं 'bash' विशिष्ट है और यह पोर्टेबल, गैर-बैश विशिष्ट, इस प्रश्न का उत्तर देने के लिए उपयोगी हो सकता है। –

+0

सरल: अपनी आखिरी पंक्ति को हटाएं और इसके बजाय इन दो पंक्तियों को करें: 'varname = $ (echo "a _ $ {v}")' echo $ {! Varname} 'के बाद। आपका स्वागत है: डी मैं इसे एक उत्तर के रूप में जोड़ूंगा लेकिन यह मुझे नहीं देगा: / – CommaToast

उत्तर

1

को मान देना चाहते हैं नीचे (ध्यान दें अंतिम पंक्ति में विस्मयादिबोधक चिह्न वाक्य रचना):

#!/bin/bash 

a_2014='hello 2014' 
year=2014 
varname=a_${year} 
echo ${!varname} 
0

पैरामीटर विस्तार पुनरावर्ती नहीं है, इसलिए पाठ ${a_${v}} वास्तव में The contents of the variable whose name is 'a_${v}' है, और खोल शिकायत है कि इस चर नाम मान्य नहीं है।

आप eval कमांड के साथ पुनरावर्ती विस्तार, के रूप में में

eval printf '%s\n' "\${a_${v}}" 

पठनीयता और अपने शेल स्क्रिप्ट के रख-रखाव की वृद्धि करने के लिए प्राप्त कर सकते हैं, तो आप इस तरह के निर्माणों के उपयोग को सीमित और उन्हें उचित ढांचे में लपेट चाहिए। उदाहरण के लिए फ्रीबीएसडी सिस्टम पर उपलब्ध rc.subr देखें।

0

बैश 4.3 भी में:

txt="Value of the variable" 

show() { echo "indirect access to $1: ${!1}"; } 

a_2014='value of a_2014' 
echo "$txt \$a_2014: $a_2014" 
show a_2014     # <-------- this -----------------------+ 
           #          | 
prefix=a      #          | 
year=2014      #          | 
string="${prefix}_${year}"  #          | 
echo "\$string: $string"  #          | 
show "$string"   #$string contains a_2014 e.g. the same as ---+ 

echo ===4.3==== 
#declare -n - only in bash 4.3 
#declare -n refvar=${prefix}_${year} 
#or 
declare -n refvar=${string} 

echo "$txt \$refvar: $refvar" 
show refvar 

echo "==assign to refvar==" 
refvar="another hello 2014" 
echo "$txt \$refvar: $refvar" 
echo "$txt \$a_2014: $a_2014" 
show a_2014 
show "$string" #same as above 
show refvar 

प्रिंट

Value of the variable $a_2014: value of a_2014 
indirect access to a_2014: value of a_2014 
$string: a_2014 
indirect access to a_2014: value of a_2014 
===4.3==== 
Value of the variable $refvar: value of a_2014 
indirect access to refvar: value of a_2014 
==assign to refvar== 
Value of the variable $refvar: another hello 2014 
Value of the variable $a_2014: another hello 2014 
indirect access to a_2014: another hello 2014 
indirect access to a_2014: another hello 2014 
indirect access to refvar: another hello 2014