बैश 3 में कोई सहयोगी सरणी नहीं है, इसलिए आपको अपने उद्देश्य के लिए किसी अन्य भाषा सुविधा का उपयोग करना होगा। ध्यान दें कि बैश 4 के तहत भी, जो कोड आपने लिखा है वह वह नहीं करता है जो आप दावा करते हैं: ./script.sh ${ARG}
एसोसिएटिव सरणी को बाल स्क्रिप्ट में पास नहीं करता है, क्योंकि ${ARG}
ARG
एक सहयोगी सरणी है जब कुछ भी नहीं फैलता है। आप एक सहयोगी सरणी को किसी बच्चे की प्रक्रिया में पास नहीं कर सकते हैं, आपको वैसे भी इसे एन्कोड करने की आवश्यकता है।
आपको मूल स्क्रिप्ट और बाल स्क्रिप्ट के बीच कुछ तर्क पारित प्रोटोकॉल को परिभाषित करने की आवश्यकता है। एक आम बात है key=value
फॉर्म में तर्क पारित करना। यह मानता है कि वर्ण =
कुंजी में प्रकट नहीं होता है।
आपको यह भी पता लगाना होगा कि मूल लिपि में और बाल स्क्रिप्ट में सहयोगी सरणी का प्रतिनिधित्व कैसे किया जाए। उन्हें एक ही प्रतिनिधित्व का उपयोग करने की आवश्यकता नहीं है।
एक सहयोगी सरणी का प्रतिनिधित्व करने के लिए एक आम विधि एक सामान्य नामकरण उपसर्ग के साथ प्रत्येक तत्व के लिए अलग-अलग चर का उपयोग करना है। इसके लिए आवश्यक है कि मुख्य नाम में केवल ASCII अक्षरों (किसी भी मामले का), अंक और अंडरस्कोर शामिल हों। उदाहरण के लिए, ${myarray[key]}
के बजाय, ${myarray__key}
लिखें। कुंजी रन टाइम पर निर्धारित किया जाता है, तो आप विस्तार का एक दौर पहले की जरूरत है: ${myarray[$key]}
के बजाय,
n=myarray__${key}; echo ${!n}
बारे में एक काम के लिए, printf -v
का उपयोग करें। निर्दिष्ट मान का उपयोग करने के लिए %s
प्रारूप printf
पर ध्यान दें। printf -v "myarray__${key}" %s "$value"
लिखें क्योंकि इससे प्रारूप के रूप में $value
का इलाज होगा और प्रिंटफ %
पर विस्तार होगा।
printf -v "myarray__${key}" %s "$value"
आप key=value
तर्क प्रतिनिधित्व के साथ एक बच्चे की प्रक्रिया के लिए इस तरह का प्रतिनिधित्व किया एक साहचर्य सरणी पारित करने के लिए की जरूरत है, तो आप ${!myarray__*}
का उपयोग सभी चर जिसका नाम myarray__
साथ शुरू होता है से अधिक की गणना करने में कर सकते हैं।
args=()
for k in ${!myarray__*}; do
n=$k
args+=("$k=${!n}")
done
बच्चे प्रक्रिया में, प्रपत्र key=value
एक उपसर्ग के साथ चर को अलग करने के तर्कों कन्वर्ट करने के लिए:
for x; do
if [[ $x != *=* ]]; then echo 1>&2 "KEY=VALUE expected, but got $x"; exit 120; fi
printf -v "myarray__${x%%=*}" %s "${x#*=}"
done
वैसे, आपको लगता है कि यह है कि तुम क्या जरूरत है सुनिश्चित हैं? किसी अन्य बैश स्क्रिप्ट से बैश स्क्रिप्ट को कॉल करने के बजाय, आप इसके बजाय एक सबहेल में बाल स्क्रिप्ट को चलाने के लिए चाहते हैं। इस तरह यह माता-पिता के सभी चर से प्राप्त होगा।
चूंकि बैश 3 में सामान्य सरणी होती है, तो आपको केवल उनके आधार पर सहयोगी सरणी लागू करनी होगी। लेकिन गंभीरता से, यह क्यों जरूरी होगा? –
कृपया देखें [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006)। –