यहां मूल समस्या यह है कि डिज़ाइन किए गए / लागू किए गए बैश डेवलपर वास्तव में पुच को खराब कर देते हैं। उन्होंने तय किया कि ${array}यह केवल एक छोटा हाथ ${array[0]}था, जो एक गलत गलती थी। खासकर जब आप उस पर विचार करते हैं${array[0]} कोई अर्थ नहीं है और खाली स्ट्रिंग का मूल्यांकन करता है यदि सरणी प्रकार साहचर्य है।
एक सरणी निरुपित करने से रूप लेता है array=(value1 ... valueN) जहाँ मान का वाक्य-विन्यास होता है [subscript]=string, जिससे किसी विशेष इंडेक्स में सीधे मान को असाइन किया जाता है। इससे यह होता है इसलिए दो प्रकार के सरणियाँ हो सकती हैं, संख्यात्मक रूप से अनुक्रमित और हैश अनुक्रमित (बैश पार्लरों में साहचर्य सरणियाँ)। यह भी बनाता है ताकि आप संख्यात्मक रूप से अनुक्रमित सरणियों को विरल बना सकें। [subscript]=भाग को छोड़ना संख्यात्मक रूप से अनुक्रमित सरणी के लिए छोटा हाथ है, 0 के क्रमिक सूचकांक से शुरू होता है और असाइनमेंट स्टेटमेंट में प्रत्येक नए मूल्य के साथ वृद्धि करता है।
इसलिए, पूरे का${array} मूल्यांकन करना चाहिए सरणी, अनुक्रमित और सभी का । इसे असाइनमेंट स्टेटमेंट के व्युत्क्रम का मूल्यांकन करना चाहिए। किसी भी तीसरे वर्ष सीएस प्रमुख को यह जानना चाहिए। उस स्थिति में, यह कोड ठीक उसी तरह काम करेगा जैसा आप उससे उम्मीद कर सकते हैं:
declare -A foo bar
foo=${bar}
फिर, फ़ंक्शंस के मान से एरेज़ को पास करना और एक ऐरे से दूसरे को असाइन करना बाकी शेल सिंटैक्स के रूप में काम करेगा। लेकिन क्योंकि उन्होंने यह अधिकार नहीं किया था, असाइनमेंट ऑपरेटर= सरणियों के लिए काम नहीं करता है, और सरणियों को कार्यों के मूल्य या सामान्य रूप से ( echo ${array}) कोड के बिना सबमिशन या आउटपुट के लिए पारित नहीं किया जा सकता है ।
तो, अगर यह सही किया गया था, तो निम्न उदाहरण दिखाएगा कि कैसे बाश में सरणियों की उपयोगिता काफी बेहतर हो सकती है:
simple=(first=one second=2 third=3)
echo ${simple}
परिणामी आउटपुट होना चाहिए:
(first=one second=2 third=3)
फिर, सरणियाँ असाइनमेंट ऑपरेटर का उपयोग कर सकती हैं, और फ़ंक्शन और अन्य शेल स्क्रिप्ट के लिए मूल्य द्वारा पारित किया जा सकता है। आसानी से एक फ़ाइल के लिए outputting द्वारा संग्रहीत, और आसानी से एक स्क्रिप्ट में एक फ़ाइल से भरी हुई।
declare -A foo
read foo <file
काश, हम एक अन्यथा शानदार विकास टीम द्वारा नीचे कर दिया गया है।
इस प्रकार, किसी फ़ंक्शन को एरे पास करने के लिए, वास्तव में केवल एक ही विकल्प है, और वह है नेमेरीफ़ फ़ीचर का उपयोग करना:
function funky() {
local -n ARR
ARR=$1
echo "indexes: ${!ARR[@]}"
echo "values: ${ARR[@]}"
}
declare -A HASH
HASH=([foo]=bar [zoom]=fast)
funky HASH # notice that I'm just passing the word 'HASH' to the function
निम्नलिखित उत्पादन में परिणाम होगा:
indexes: foo zoom
values: bar fast
चूंकि यह संदर्भ से गुजर रहा है, आप फ़ंक्शन में सरणी को भी असाइन कर सकते हैं। हां, संदर्भित की जा रही सरणी में वैश्विक स्कोप होना चाहिए, लेकिन यह बहुत बड़ी बात नहीं होनी चाहिए, यह देखते हुए कि यह शेल स्क्रिप्टिंग है। किसी फ़ंक्शन के लिए एक सहयोगी या विरल अनुक्रमित सरणी को पास करने के लिए तर्क सूची पर सभी अनुक्रमित और मानों को फेंकने की आवश्यकता होती है (यदि यह एक बड़ा सरणी है तो उपयोगी नहीं है) जैसे एकल तार।
funky "${!array[*]}" "${array[*]}"
और फिर फ़ंक्शन के अंदर कोड का एक गुच्छा सरणी को फिर से इकट्ठा करने के लिए लिख रहा है।