2012-06-12 22 views
9

मेरे पास एक बैश स्क्रिप्ट है जिसमें मुझे तीसरे कॉल करने के लिए 2 चर को संयोजित करने के साथ कुछ समस्याएं हैं।बैश, 3 स्ट्रिंग्स को संदर्भित करने के लिए 2 स्ट्रिंग्स को संदर्भित करना

यहां लिपि का एक सरलीकरण है, लेकिन वाक्यविन्यास दस्तावेज़ पढ़ने के बाद मुझे छेड़छाड़ कर रहा है।

server_list_all="server1 server2 server3"; 
var1 = "server"; 
var2 = "all"; 

echo $(($var1_list_$var2)); 

यह करीब के करीब है जैसा कि मुझे सही उत्तर मिलता है, यह स्ट्रिंग को स्वीकार करता है और टोकननाइजेशन पर एक त्रुटि को टॉस करता है।

syntax error in expression (error token is "server1 server2 server3.... 

इसके लिए दस्तावेज़ों में वास्तव में कुछ भी नहीं देख रहा है, लेकिन यह करने योग्य होना चाहिए।

संपादित करें:

+2

कृपया देखें [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006)। –

उत्तर

20

Bash Reference Manual explains how you can use a neat feature of parameter expansion ऊपर साफ़ थोड़ा कुछ अविवेक क्या करना है।

server_list_all="server1 server2 server3" 
var1=server 
var2=all 
combined=${var1}_list_${var2} 

echo ${!combined} 

विस्मयादिबोधक चिह्न जब combined की चर्चा करते हुए का अर्थ है "चर जिसका नाम सामग्री से परिभाषित किया गया है का उपयोग करें: आपके मामले में, आप एक चर जिसका नाम दो अन्य चर द्वारा परिभाषित किया गया है की सामग्री को खोजने में रुचि रखते हैं combined "

+1

बहुत बहुत धन्यवाद! मैंने इसे एक लाइन का उपयोग करके एक लाइन को शूट करने की कोशिश की!, लेकिन प्रतिस्थापन त्रुटि प्राप्त कर रही थी। तो आपको एक मध्यवर्ती चर का उपयोग करना होगा। एक बार फिर धन्यवाद! –

+0

तो क्या कोई नया चर बनाने के बिना ऐसा करने का कोई तरीका नहीं है? –

+0

@ टिमोथीसवान, 'eval "echo \' echo \\ $ \\ {$ {var1} _list _ $ {var2} \} \ '" 'लेकिन यह सिर्फ बुरा है। –

6

उन्नत बैश स्क्रिप्टिंग गाइड का आपके लिए जवाब है (http://tldp.org/LDP/abs/html/ivr.html)।

#!/bin/bash 

server_list_all="server1 server2 server3"; 
var1="server"; 
var2="all"; 

server_var="${var1}_list_${var2}" 
eval servers=\$$server_var; 

echo $servers 

वैकल्पिक रूप से आप बैश शॉर्टकट $ {! वर} का उपयोग कर सकते

#!/bin/bash 

server_list_all="server1 server2 server3"; 
var1="server"; 
var2="all"; 

server_var="${var1}_list_${var2}" 
echo ${!server_var} 

या तो दृष्टिकोण काम करता है: आपके पास दो विकल्प है, पहली क्लासिक खोल है।

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

  • कोई संबंधित समस्या नहीं^_^