यदि आपके पास Git उपलब्ध है और मुख्य नामों में अंडरस्कोर का उपयोग न कर पाने की बाधा के साथ ठीक है, तो आप git configएक सामान्य-उद्देश्य INI पार्सर / संपादक के रूप में उपयोग कर सकते हैं ।
यह चारों ओर से मुख्य / मान जोड़े बाहर पार्स करने संभाल लेंगे =और छोड़ें तुच्छ खाली स्थान के, प्लस आप टिप्पणी (दोनों मिल ;और #) और प्रकार बलात्कार मूल रूप से मुक्त करने के लिए। मैंने नीचे ओपी के इनपुट .iniऔर वांछित आउटपुट (बैश साहचर्य सरणियों) के लिए एक पूर्ण कार्य उदाहरण शामिल किया है ।
हालाँकि, इस तरह एक कॉन्फिगर फाइल दी गई है
; mytool.ini
[section1]
inputdir = ~/some/dir
enablesomefeature = true
enablesomeotherfeature = yes
greeting = Bonjour, Monde!
[section2]
anothersetting = 42
... बशर्ते आपको बस एक त्वरित-गंदे समाधान की आवश्यकता है, और एक बैश साहचर्य सरणी में सेटिंग्स होने के विचार से शादी नहीं की है, आप कम से कम के साथ दूर हो सकते हैं:
eval $(git config -f mytool.ini --list | tr . _)
# or if 'eval' skeeves you out excessively
source <(git config -f mytool.ini --list | tr . _)
जो sectionname_variablenameवर्तमान परिवेश में नामित पर्यावरण चर बनाता है। यह, निश्चित रूप से, केवल तभी काम करता है जब आप भरोसा कर सकते हैं कि आपके किसी भी मूल्य में कभी भी एक अवधि या व्हाट्सएप नहीं होगा (अधिक मजबूत समाधान के लिए नीचे देखें)।
अन्य सरल उदाहरण
टाइपिंग को बचाने के लिए शेल फ़ंक्शन का उपयोग करके मनमाना मान प्राप्त करना:
function myini() { git config -f mytool.ini; }
बैस मैन पेज के अनुसार, एक उपनाम भी ठीक होगा, लेकिन वे भी शेल स्क्रिप्ट [ 1 ] में सामान्य रूप से विस्तारित नहीं होते हैं , और वैसे भी उपनामों को शेल कार्यों द्वारा "" [ 2 ] के रूप में फैलाया जाता है ।
myini --list
# result:
# section1.inputdir=~/some/dir
# section1.enablesomefeature=true
# section1.enablesomeotherfeature=yes
# section2.anothersetting=42
myini --get section1.inputdir
# result:
# ~/some/dir
--typeविकल्प के साथ , आप पूर्णांक, बूलियन, या पथ के रूप में विशिष्ट सेटिंग्स को "स्वचालित रूप से विस्तारित" कर सकते हैं ~:
myini --get --type=path section1.inputdir # value '~/some/dir'
# result:
# /home/myuser/some/dir
myini --get --type=bool section1.enablesomeotherfeature # value 'yes'
# result:
# true
थोड़ा अधिक मजबूत त्वरित और गंदा उदाहरण
वर्तमान परिवेश में सभी वैरिएबल mytool.iniउपलब्ध कराएं SECTIONNAME_VARIABLENAME, आंतरिक व्हॉट्सएप को प्रमुख मूल्यों में संरक्षित करना:
source <(
git config -f mytool.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/\U\1_\2\E="\3"/'
)
अंग्रेजी में sed अभिव्यक्ति क्या कर रही है, है
- एक अवधि तक गैर-अवधि वर्णों का एक गुच्छा ढूंढना, जो कि
\1तब याद रखना
- एक समान चिह्न तक वर्णों का एक समूह ढूंढना, जैसा कि
\2, और याद रखना
- बराबरी पर हस्ताक्षर के बाद सभी पात्रों को खोजना
\3
- अंत में, प्रतिस्थापन स्ट्रिंग में
- अनुभाग नाम + चर नाम ऊपरी आवरण वाला है, और
- मान भाग को दोहरे-उद्धृत किया जाता है, यदि इसमें ऐसे अक्षर हैं जो खोल के लिए विशेष अर्थ रखते हैं यदि अयोग्य (जैसे व्हॉट्सएप)
\Uऔर \Eप्रतिस्थापन स्ट्रिंग में दृश्यों (जो अपर-केस कि प्रतिस्थापन स्ट्रिंग के भाग) जीएनयू हैं sedविस्तार। MacOS और BSD पर, आप -eएक ही प्रभाव को प्राप्त करने के लिए कई अभिव्यक्तियों का उपयोग करेंगे ।
खंड नाम (जो git configअनुमति देता है) में एम्बेडेड कोट्स और व्हाट्सएप से निपटना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।:)
बैश साहचर्य सरणी में कुंजियों के रूप में अनुभाग नामों का उपयोग करना
दिया हुआ:
; foo.ini
[foobar]
session=foo
path=/some/path
[barfoo]
session=bar
path=/some/path
इसका परिणाम यह होगा कि ओपी आपसे रिक्वेस्ट करने के लिए, सेड रिप्लेसमेंट एक्सप्रेशन में से कुछ कैप्चर को रीक्रिएट करके, और जीएनयू सेड के बिना ठीक काम करेगा:
source <(
git config -f foo.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/declare -A \2["\1"]="\3"/'
)
मैं भविष्यवाणी करता हूं कि वास्तविक दुनिया की .iniफ़ाइल के लिए उद्धृत करने के साथ कुछ चुनौतियां हो सकती हैं , लेकिन यह उपलब्ध उदाहरण के लिए काम करता है। परिणाम:
declare -p {session,path}
# result:
# declare -A session=([barfoo]="bar" [foobar]="foo" )
# declare -A path=([barfoo]="/some/path" [foobar]="/some/path" )