क्या बैश स्क्रिप्ट में कुंजी-मूल्य जोड़े बनाने का एक तरीका है?


82

मैं बैश स्क्रिप्ट का उपयोग करके मुख्य मूल्य जोड़ी का शब्दकोश बनाने की कोशिश कर रहा हूं। मैं इस तर्क का उपयोग करने की कोशिश कर रहा हूं:

declare -d dictionary
defaults write "$dictionary" key -string "$value"

... जहां $dictionaryएक चर है, लेकिन यह काम नहीं कर रहा है।

क्या बैश स्क्रिप्ट में कुंजी-मूल्य जोड़े बनाने का एक तरीका है?


मैं बैश पर काम कर रहा था। खुद ऐसा करने का एक तरीका निकाला।
आरकेएस

इसके उपयोग से भी मदद मिलती है: urls + = ('<ताना> <key> key1 </ key> <string>' $ value1 '</ string> <key> key2 </ key> <string>' $ value2 '</ string > <key> key3 </ key> <string> '$ value3' </ string> </ ताना> '
RKS

3
महान! आपको StackOverflow पर अपने स्वयं के प्रश्नों का उत्तर देने की अनुमति है (और यहां तक ​​कि प्रोत्साहित किया गया है), इस तरह से आप एक समान स्थिति में दूसरों की मदद करेंगे।
जॉन्सवेब

यदि आप कुछ नमूना उपयोग और आउटपुट शामिल करते हैं तो मैं आपके उत्तर को बढ़ा दूंगा। सौभाग्य।
शेल्टर

जवाबों:


154

बैश संस्करण में 4 सहयोगी सरणियों को पेश किया गया था।

declare -A arr

arr["key1"]=val1

arr+=( ["key2"]=val2 ["key3"]=val3 )

गिरफ्तार सरणी में अब तीन प्रमुख मूल्य जोड़े हैं। बैश काफी सीमित है जो आप उनके साथ कर सकते हैं हालांकि, कोई छँटाई या पॉपिंग आदि नहीं।

for key in ${!arr[@]}; do
    echo ${key} ${arr[${key}]}
done

सभी प्रमुख मूल्यों पर लूप करेंगे और उन्हें बाहर निकालेंगे।

नोट: Bash 4 अपने GPLv3 लाइसेंस के कारण Mac OS X के साथ नहीं आता है; आपको इसे डाउनलोड और इंस्टॉल करना होगा। उस पर अधिक के लिए यहां देखें


25
यह ध्यान रखना महत्वपूर्ण है कि बैश 4 अपने जीपीएल 3 लाइसेंस के कारण मैक ओएस एक्स के साथ नहीं आता है; आपको इसे डाउनलोड और इंस्टॉल करना होगा। (Apple अभी भी बैश 3.2 को शिप करता है।)
कृपया

5
यहाँ एक con है: सम्मिलन आदेश द्वारा पुनरावृत्ति का आदेश नहीं दिया गया है।
एलिकएल्ज़िन-किलाका

निश्चित रूप से बैश संस्करण की आवश्यकता है 4. अन्यथा घोषित करें-कोई काम नहीं करता है। मैक बैश 3.2 के साथ आता है
मामून

2
यह GPLv3 लाइसेंस के कारण नहीं है, लेकिन क्योंकि Apple GPLv3 लाइसेंस सॉफ्टवेयर का उपयोग नहीं करना चाहता है। तो यह GPLv3 लाइसेंस के साथ कुछ भी गलत नहीं है लेकिन Apple के साथ कुछ गलत है, मुझे लगता है।
टेक घुमंतू

32

यदि आप एक सरल सीमांकक का उपयोग कर सकते हैं, तो एक बहुत ही सरल ऑनलाइनर यह है:

for i in a,b c_s,d ; do 
  KEY=${i%,*};
  VAL=${i#*,};
  echo $KEY" XX "$VAL;
done

इस iतरह से "a,b"और चरित्र दृश्यों से भर जाता है "c_s,d"। प्रत्येक स्थान से अलग हो गया। बाद doहम उपयोग पैरामीटर प्रतिस्थापन अल्पविराम से पहले भाग को निकालने के लिए ,और यह करने के बाद भाग।


क्या आप कृपया दिए गए उदाहरण की व्याख्या कर सकते हैं?
एलिकएल्ज़िन-किलाका

प्रश्न: क्या यह काम करेगा यदि bएक चर युक्त रिक्त स्थान है?
एलिकएल्ज़िन-किलाका

मेरे उदाहरण में, बी एक चर नहीं है, और नहीं यह काम नहीं करेगा, क्योंकि फॉर-लूप की सूची अलग है।
गणित

2

निरंतर कुंजी / मूल्य संग्रहण के लिए, आप https://github.com/damphat/kv-bashkv-bash पर उपलब्ध कुंजी / मूल्य डेटाबेस का शुद्ध उपयोग लागू कर सकते हैं

प्रयोग

git clone https://github.com/damphat/kv-bash
source kv-bash/kv-bash

कुछ स्थायी चर बनाने की कोशिश करें

kvset myName  xyz
kvset myEmail xyz@example.com

#read the varible
kvget myEmail

#you can also use in another script with $(kvget keyname)
echo $(kvget myEmail)

2

बाश में, हम उपयोग करते हैं

declare -A name_of_dictonary_variable

ताकि बाश समझता है कि यह एक शब्दकोश है।

उदाहरण के लिए आप soundsतब शब्दकोश बनाना चाहते हैं ,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

कहाँ dogऔर wolfहैं "keys", Barkऔर Howlहैं "values"

आप सभी मूल्यों का उपयोग कर सकते हैं: echo ${sounds[@]}याecho ${sounds[*]}

आप केवल उपयोग करके सभी कुंजी तक पहुँच सकते हैं: echo ${!sounds[@]}

और यदि आप किसी विशेष कुंजी के लिए कोई मूल्य चाहते हैं, तो आप उपयोग कर सकते हैं:

${sounds[dog]}

यह आपको Barkकुंजी ( Dog) के लिए मूल्य ( ) देगा।


0

पुराने बैश (या में sh) जो समर्थन नहीं करता है declare -A, निम्नलिखित शैली का उपयोग कुंजी / मूल्य का अनुकरण करने के लिए किया जा सकता है

# key
env=staging


# values
image_dev=gcr.io/abc/dev
image_staging=gcr.io/abc/stage
image_production=gcr.io/abc/stable

img_var_name=image_$env

# active_image=${!var_name}
active_image=$(eval "echo \$$img_var_name")

echo $active_image
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.