यदि आपने कभी कोड लिखा है, चाहे वह शेल स्क्रिप्ट हो, पायथन स्क्रिप्ट, C++, या यहां तक कि स्क्रैच, तो आप जानते हैं कि वेरिएबल महत्वपूर्ण हैं। कंप्यूटर और कोडर वेरिएबल का उपयोग वेस्टेशन के रूप में करते हैं, जहां वे गुप्त रूप से जानकारी को आगे-पीछे पास करते हैं। उदाहरण के लिए, यदि आपको शेल स्क्रिप्ट में किसी उपयोगकर्ता के नाम को प्रोसेस करने की आवश्यकता है, तो आप एक वेरिएबल सेट कर सकते हैं, उसमें यूजरनेम डाल सकते हैं, और फिर कंप्यूटर को उस वेरिएबल पर कुछ करने का निर्देश दे सकते हैं (उदाहरण के लिए, इसे अधिकृत उपयोगकर्ताओं की सूची के विरुद्ध जांचें)। वेरिएबल महत्वपूर्ण हैं क्योंकि वे कोड को डायनामिक बनाने में सक्षम बनाते हैं: वे उस जानकारी के लिए प्लेसहोल्डर हैं जो हर बार कोड चलाने पर बदलने की उम्मीद है।
लेकिन वेरिएबल, क्योंकि वे इतने आम हैं, बल्कि अनियंत्रित भी हो सकते हैं। अक्सर, आप एक कोड प्रोजेक्ट में इतने सारे वेरिएबल इकट्ठा कर लेते हैं कि उन सभी को ट्रैक करना लगभग असंभव हो जाता है। आप चतुर कन्वेंशन का उपयोग कर सकते हैं, जैसे सभी संबंधित वेरिएबल को एक सामान्य स्ट्रिंग (user_name, user_pass, user_time, आदि) से प्रीफिक्स करना, या आप आसान संदर्भ के लिए उनके लिए एक मास्टर सूची बना सकते हैं, लेकिन यह सब ट्रैक रखने का ओवरहेड बोझिल हो सकता है।
इस समस्या का एक पारंपरिक उत्तर ऐरे रहा है। ये अधिकांश कोडिंग भाषाओं में अच्छी तरह से काम करते हैं, जिसमें बैश जैसी शेल स्क्रिप्टिंग भाषाएं शामिल हैं।
अधिकांश शेल इंडेक्स्ड ऐरे बनाने, हेरफेर करने और क्वेरी करने की क्षमता प्रदान करते हैं। सरल अंग्रेजी में, एक इंडेक्स्ड ऐरे चीजों की एक सूची है जिसे एक नंबर से प्रीफिक्स किया गया है। चीजों की यह सूची, उनके असाइन किए गए नंबर के साथ, एक सिंगल वेरिएबल में आसानी से लपेटी जाती है, जो इसे आपके कोड में "ले जाने" में आसान बनाता है।
हालांकि, बैश में एसोसिएटिव ऐरे बनाने की क्षमता शामिल है, और यह इन ऐरे को किसी अन्य ऐरे के समान मानता है। एक एसोसिएटिव ऐरे आपको केवल नंबर वाले मानों के बजाय कुंजी और मान जोड़े की सूची बनाने देता है।
आप मनमानी कुंजियों को मान निर्दिष्ट कर सकते हैं:
$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`
किसी भी कुंजी को क्वेरी करें:
$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192
आपके द्वारा ऐरे से अपेक्षित अधिकांश सामान्य ऐरे ऑपरेशन उपलब्ध हैं। उदाहरण के लिए, आप सभी मानों को सूचीबद्ध कर सकते हैं:
$ echo "${userdata[*]}"
8eab07eb620533b083f241ec4e6b9724 seth 1583362192
आप पूरे ऐरे को देख सकते हैं:
$ typeset -A
declare -A BASH_ALIASES='()'
declare -A BASH_CMDS='()'
declare -A userdata='([pass]="8eab07eb620533b083f241ec4e6b9724"
[name]="seth"
[login]="1583362192" )'
आप unset कमांड का उपयोग करके अपने ऐरे से आइटम भी हटा सकते हैं:
$ unset userdata[pass]
$ typeset -A
[...]
declare -A userdata='([name]="seth"
[login]="1583362192" )'
अंत में, आप पूरे ऐरे को खारिज कर सकते हैं।
$ unset "userdata[*]"
डेटा के लिए ऐरे
ऐरे संबंधित डेटा को एक साथ संग्रहीत करने के लिए उपयोगी उपकरण हैं। आप ज्यादातर मामलों में एक सादे पुराने वेरिएबल का उपयोग कर सकते हैं, लेकिन कभी-कभी एक सिंगल डेटा "ऑब्जेक्ट" के गुणों को एक ऐरे में संग्रहीत करना अधिक तार्किक होता है, ताकि डेटा समेकित और अनुक्रमित रहे। उदाहरण के लिए, यदि आप utmp से लॉगिन नाम और समय प्रोसेस कर रहे हैं, तो आपके लिए लॉगिन समय को उस उपयोगकर्ता के साथ जोड़ना अधिक उपयोगी होगा जिसे वह समय संदर्भित करता है, बजाय केवल दो डेटा ऑब्जेक्ट को बिना किसी स्पष्ट कनेक्शन के अलग-अलग वेरिएबल के रूप में संग्रहीत करने के।
इसके अलावा, वेरिएबल के विपरीत, एक ऐरे में एक प्रविष्टि को डेटा संग्रहीत करने से पहले मौजूद होने की आवश्यकता नहीं है। आपको डेटा संग्रहीत करने से पहले यह जानने की आवश्यकता नहीं है कि कितना डेटा संग्रहीत होने वाला है। यदि आप उस डेटा को प्रोसेस कर रहे हैं जिसे आप नियंत्रित या भविष्यवाणी नहीं कर सकते तो यह एक बड़ा लाभ हो सकता है: यदि आप नहीं जानते कि एक दिन से अगले दिन utmp में कितने उपयोगकर्ताओं की उम्मीद है, तो सभी प्रविष्टियों को समाहित करने के लिए एक स्क्रिप्ट बनाना कठिन है। एक ऐरे के साथ, हालांकि, आपको बस एक ऐरे घोषित करना होगा और डेटा को इसमें पढ़ना होगा, एक नई कुंजी और मान जोड़ी बनाते हुए जब तक आप डेटा को निगलने से बाहर नहीं निकल जाते।
ऐरे शक्तिशाली हैं, और वे बैश से परे प्रोग्रामिंग भाषाओं में आम हैं। अब उनका उपयोग शुरू करें!