ऐरे तत्वों तक पहुँचना
तो सरणियाँ किसके लिए अच्छी हैं? जिस तरह कई डेटा-प्रबंधन कार्य एक स्प्रेडशीट प्रोग्राम के साथ किए जा सकते हैं, उसी तरह कई प्रोग्रामिंग कार्य एरे के साथ किए जा सकते हैं।
आइए एक सरल डेटा-एकत्रण और प्रस्तुति उदाहरण पर विचार करें। हम एक स्क्रिप्ट का निर्माण करेंगे जो एक निर्दिष्ट निर्देशिका में फ़ाइलों के संशोधन समय की जांच करेगी। इस डेटा से, हमारी स्क्रिप्ट एक तालिका प्रदर्शित करेगी जिसमें दिखाया जाएगा कि फ़ाइलों को अंतिम बार दिन के किस समय संशोधित किया गया था। ऐसी स्क्रिप्ट का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोई सिस्टम सबसे अधिक सक्रिय कब है। इस लिपि को कहा जाता है घंटे, यह परिणाम उत्पन्न करता है:
[मुझे@लिनक्सबॉक्स ~]$ घंटे ।
घंटा | फ़ाइलें | घंटा | फ़ाइलें |
---- | ----- | ---- | ----- |
00 | 0 | 12 | 11 |
01 | 1 | 13 | 7 |
02 | 0 | 14 | 1 |
03 | 0 | 15 | 7 |
04 | 1 | 16 | 6 |
05 | 1 | 17 | 5 |
06 | 6 | 18 | 4 |
07 | 3 | 19 | 4 |
08 | 1 | 20 | 1 |
09 | 14 | 21 | 0 |
10 | 2 | 22 | 0 |
11 | 5 | 23 | 0 |
कुल फ़ाइलें = 80
हम निष्पादित करते हैं घंटे प्रोग्राम, वर्तमान निर्देशिका को लक्ष्य के रूप में निर्दिष्ट करता है। यह दिन के प्रत्येक घंटे (0-23) के लिए एक तालिका प्रस्तुत करता है, जिसमें अंतिम बार कितनी फ़ाइलें संशोधित की गईं थीं। इसे बनाने का कोड इस प्रकार है:
#! / Bin / bash
# घंटे: संशोधन समय उपयोग द्वारा फ़ाइलों की गिनती करने के लिए स्क्रिप्ट () {
इको "उपयोग: ${0##*/} निर्देशिका" >&2
}
#! / Bin / bash
# घंटे: संशोधन समय उपयोग द्वारा फ़ाइलों की गिनती करने के लिए स्क्रिप्ट () {
इको "उपयोग: ${0##*/} निर्देशिका" >&2
}
# जांचें कि तर्क एक निर्देशिका है यदि [[ ! -डी $1 ]]; तब
उपयोग निकास 1
fi
# सरणी आरंभ करें
मेरे लिए {0..23} में; घंटे करो[i]=0; हो गया
# डेटा जुटाओ
i के लिए $(stat -c %y "$1"/* | कट -c 12-13); करो j=${i/#0}
((++घंटे[जे])) ((++गिनती))
किया
# जानकारी दिखाओ
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t-----\t----\t-----" for i in {0..11} ; करना
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} हो गया
प्रिंटफ "\nकुल फ़ाइलें = %d\n" $गिनती
# जांचें कि तर्क एक निर्देशिका है यदि [[ ! -डी $1 ]]; तब
उपयोग निकास 1
fi
# सरणी आरंभ करें
मेरे लिए {0..23} में; घंटे करो[i]=0; हो गया
# डेटा जुटाओ
i के लिए $(stat -c %y "$1"/* | कट -c 12-13); करो j=${i/#0}
((++घंटे[जे])) ((++गिनती))
किया
# जानकारी दिखाओ
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t-----\t----\t-----" for i in {0..11} ; करना
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} हो गया
प्रिंटफ "\nकुल फ़ाइलें = %d\n" $गिनती
स्क्रिप्ट में एक फ़ंक्शन होता है (प्रयोग) और चार खंडों वाला एक मुख्य निकाय। पहले खंड में, हम जांचते हैं कि एक कमांड लाइन तर्क है और यह एक निर्देशिका है। यदि ऐसा नहीं है, तो हम उपयोग संदेश प्रदर्शित करते हैं और बाहर निकल जाते हैं।
दूसरा खंड सरणी को आरंभ करता है घंटे. यह प्रत्येक तत्व को शून्य का मान निर्दिष्ट करके ऐसा करता है। उपयोग से पहले सरणियाँ तैयार करने की कोई विशेष आवश्यकता नहीं है, लेकिन हमारी स्क्रिप्ट को यह सुनिश्चित करने की आवश्यकता है कि कोई भी तत्व खाली न हो। लूप के निर्माण के दिलचस्प तरीके पर ध्यान दें। ब्रेस विस्तार को नियोजित करके ({0..23}), हम आसानी से शब्दों का एक क्रम तैयार करने में सक्षम हैं एसटी आदेश।
अगला अनुभाग चलाकर डेटा एकत्र करता है स्टेट निर्देशिका में प्रत्येक फ़ाइल पर प्रोग्राम। हम उपयोग करते हैं कमी परिणाम से दो अंकों का घंटा निकालने के लिए। लूप के अंदर, हमें घंटा फ़ील्ड से अग्रणी शून्य को हटाने की आवश्यकता है, क्योंकि शेल "00" से "09" तक के मानों को ऑक्टल संख्याओं के रूप में व्याख्या करने का प्रयास करेगा (और अंततः विफल हो जाएगा) (तालिका 34-2 देखें)। इसके बाद, हम दिन के घंटे के अनुरूप सरणी तत्व का मान बढ़ाते हैं। अंत में, हम एक काउंटर बढ़ाते हैं (गणना) निर्देशिका में फ़ाइलों की कुल संख्या को ट्रैक करने के लिए।
स्क्रिप्ट का अंतिम भाग सरणी की सामग्री प्रदर्शित करता है। हम पहले कुछ हेडर पंक्तियों को आउटपुट करते हैं और फिर एक लूप दर्ज करते हैं जो आउटपुट के चार कॉलम उत्पन्न करता है। अंत में, हम फ़ाइलों का अंतिम मिलान आउटपुट करते हैं।