2012-09-05 7 views
7

मैं निम्नलिखित सामग्री के साथ एक कॉन्फ़िग फ़ाइल है में फ़ाइल चर पढ़ें:बैश स्क्रिप्ट स्थानीय चर

msgs.config:

tmsg:This is Title Message! 
t1msg:This is T1Message.  
t2msg:This is T2Message.  
pmsg:This is personal Message! 

मैं एक bash स्क्रिप्ट msgs.config फ़ाइल चर पढ़ता लिख ​​रहा हूँ और उन्हें स्थानीय चर में स्टोर करता है। मैं इन लिपि में इनका उपयोग करूंगा। अनुमति के कारण मैं . विधि (स्रोत) का उपयोग नहीं करना चाहता हूं।

tmsg 
t1msg 
t2msg 
pmsg 

किसी भी मदद की सराहना की जाएगी।

+1

* अनुमति के कारण मैं इसका उपयोग नहीं करना चाहता हूं। विधि (स्रोत) * सुनिश्चित नहीं है कि इससे कैसे मदद मिलेगी, लेकिन आपको केवल 'स्रोत' का उपयोग करने के लिए पढ़ने की अनुमति की आवश्यकता है, और यदि आप इसे पढ़ नहीं सकते हैं ... – cdarke

उत्तर

8

आप उपयोग कर सकते हैं:

oldIFS="$IFS" 
IFS=":" 
while read name value 
do 
    # Check value for sanity? Name too? 
    eval $name="$value" 
done < $config_file 
IFS="$oldIFS" 

वैकल्पिक रूप से, आप एक एसोसिएटिव सरणी का उपयोग कर सकते हैं:

declare -A keys 
oldIFS="$IFS" 
IFS=":" 
while read name value 
do 
    keys[$name]="$value" 
done < $config_file 
IFS="$oldIFS" 

अब आप चरों तक पहुंचने के लिए ${keys[tmsg]} आदि का संदर्भ ले सकते हैं। मामले में

tmsg="${keys[tmsg]}" 
+1

' oldIFS 'को सहेजने की कोई आवश्यकता नहीं है; आप 'IFS' में 'read' कमांड' में परिवर्तन को प्रतिबंधित कर सकते हैं, जबकि 'IFS =: नाम मान पढ़ें'। इसके अलावा, "सभी की मदद के लिए बजाय' eval' की $ नाम = $ मान' – chepner

+0

धन्यवाद आप सुझाव दे रहे हैं।।: oldIFS = "' का उपयोग घोषित $ आईएफएस " आईएफएस =": " जबकि आईएफएस =: नाम पढ़ा मूल्य \t घोषित "$ नाम = $ मूल्य" कर किया <$ config_file – thegreat078

+0

thegreat078 @: सुझाव 'से बचने के लिए oldIFS' पूरी तरह और बस है का उपयोग करें:' जबकि आईएफएस = ':' पढ़ने के नाम पाश में मान' (इसलिए आपको लूप के बाद आईएफएस रीसेट करने की आवश्यकता नहीं है)। यह उचित है, मान लीजिए कि यह काम करता है। और यदि '$ नाम =" $ मूल्य "घोषण कार्य घोषित करता है (मेरे पास ऐसा सोचने का कोई कारण नहीं है कि यह नहीं है, लेकिन बैश 3.2 के साथ एक मशीन पर फंस गया था - जिसमें सहयोगी सरणी नहीं है), तो यह निश्चित रूप से 'eval' की तुलना में बहुत कम त्रुटि है (जो लगभग हमेशा आग के साथ खेल रहा है, लेकिन कुछ है आवश्यक समय; ओटीओएच, बैश ने इसे एक बार ऐसा करने के लिए बहुत कम करने के लिए बहुत कुछ किया है, जो एक अच्छा बात है!) –

1

i=0 
config_file="/path/to/msgs.config" 

while read line 
do 
    if [ ! -z "$line" ] #check if the line is not blank 
    then 
    key[i]=`echo $line|cut -d':' -f1` #will extract tmsg from 1st line and so on 
    val[i]=`echo $line|cut -d':' -f2` #will extract "This is Title Message!" from line 1 and so on 
    ((i++)) 
    fi 
done < $config_file 

पहुँच फ़ाइल पढ़ें और स्टोर values- सरणी चर ${key[0]}, ${key[1]}, .... और ${val[0]}, ${val[1]} के रूप में ...

1

आप अपना मन बदल के बारे में source: या, यदि चर की सूची तय हो गई है, तो आप मान चर मैप कर सकते

source <(sed 's/:\(.*\)/="\1"/' msgs.config) 

यह काम नहीं करता है, तो अपने से कोई भी मान डबल उद्धरण है।