समूह आदेश और उपकोश
खूब जोर से पीटना आदेशों को एक साथ समूहीकृत करने की अनुमति देता है। यह दो तरीकों में से एक में किया जा सकता है; या तो एक के साथ समूह आदेश या ए के साथ निर्वाह करना. यहां प्रत्येक के वाक्यविन्यास के उदाहरण दिए गए हैं:
समूह आदेश:
{कमांड1; कमांड2; [कमांड3; ...] }
उपकोश:
(कमांड1; कमांड2; [कमांड3;...])
दोनों रूप इस मायने में भिन्न हैं कि एक समूह कमांड अपने कमांड को ब्रेसिज़ से घेरता है और एक उपकोश कोष्ठक का उपयोग करता है। यह ध्यान रखना जरूरी है कि, रास्ते के कारण खूब जोर से पीटना समूह आदेशों को लागू करता है, ब्रेसिज़ को एक रिक्त स्थान द्वारा कमांड से अलग किया जाना चाहिए और अंतिम कमांड को समापन ब्रेस से पहले अर्धविराम या एक नई पंक्ति के साथ समाप्त किया जाना चाहिए।
तो ग्रुप कमांड और सबशेल किसके लिए अच्छे हैं? हालाँकि उनमें एक महत्वपूर्ण अंतर है (जिसे हम एक क्षण में समझेंगे), उन दोनों का उपयोग पुनर्निर्देशन को प्रबंधित करने के लिए किया जाता है। आइए एक स्क्रिप्ट सेगमेंट पर विचार करें जो एकाधिक कमांड पर पुनर्निर्देशन करता है:
ls -l > आउटपुट.txt
इको "foo.txt की सूची" >> आउटपुट.txt cat foo.txt >> आउटपुट.txt
ls -l > आउटपुट.txt
इको "foo.txt की सूची" >> आउटपुट.txt cat foo.txt >> आउटपुट.txt
यह बहुत सीधा है. तीन कमांड अपने आउटपुट के साथ नामित फ़ाइल पर रीडायरेक्ट किए गए output.txt. ग्रुप कमांड का उपयोग करके, हम इसे इस प्रकार कोड कर सकते हैं:
{ एलएस -एल; इको "foo.txt की सूची"; बिल्ली foo.txt; } > आउटपुट.txt
{ एलएस -एल; इको "foo.txt की सूची"; बिल्ली foo.txt; } > आउटपुट.txt
उपकोश का उपयोग करना समान है:
(ls -l; इको "foo.txt की सूची"; cat foo.txt) > आउटपुट.txt
(ls -l; इको "foo.txt की सूची"; cat foo.txt) > आउटपुट.txt
इस तकनीक का उपयोग करके हमने खुद को कुछ टाइपिंग से बचा लिया है, लेकिन जहां समूह कमांड या सबशेल वास्तव में चमकता है वह पाइपलाइनों के साथ है। आदेशों की एक पाइपलाइन का निर्माण करते समय, कई आदेशों के परिणामों को एक ही स्ट्रीम में संयोजित करना अक्सर उपयोगी होता है। समूह आदेश और उपकोश इसे आसान बनाते हैं:
{ एलएस -एल; इको "foo.txt की सूची"; बिल्ली foo.txt; } | एलपीआर
{ एलएस -एल; इको "foo.txt की सूची"; बिल्ली foo.txt; } | एलपीआर
यहां हमने अपने तीन कमांड के आउटपुट को संयोजित किया है और उन्हें इनपुट में पाइप किया है LPR एक मुद्रित रिपोर्ट तैयार करने के लिए.
इसके बाद आने वाली स्क्रिप्ट में, हम समूह कमांड का उपयोग करेंगे और कई प्रोग्रामिंग तकनीकों को देखेंगे जिन्हें सहयोगी सरणियों के साथ संयोजन में नियोजित किया जा सकता है। इस लिपि को कहा जाता है सारणी-2, जब किसी निर्देशिका का नाम दिया जाता है, तो फ़ाइल के स्वामी और समूह स्वामी के नाम के साथ निर्देशिका में फ़ाइलों की एक सूची प्रिंट करता है। सूची के अंत में, स्क्रिप्ट प्रत्येक स्वामी और समूह से संबंधित फ़ाइलों की संख्या का मिलान प्रिंट करती है। यहां हम परिणाम देखते हैं (संक्षिप्तता के लिए संक्षिप्त) जब स्क्रिप्ट को निर्देशिका दी जाती है
/usr/बिन:
[मुझे@लिनक्सबॉक्स ~]$ सरणी-2 /usr/bin | ||
/usr/bin/2to3-2.6 | जड़ | जड़ |
/usr/bin/2to3 | जड़ | जड़ |
/usr/bin/a2p | जड़ | जड़ |
/usr/bin/abrowser | जड़ | जड़ |
/usr/bin/aconnect | जड़ | जड़ |
/usr/bin/acpi_fakekey | जड़ | जड़ |
/usr/bin/acpi_listen | जड़ | जड़ |
/usr/bin/add-apt-repository | जड़ | जड़ |
. | ||
. | ||
. | ||
/usr/bin/zipgrep | जड़ | जड़ |
/usr/bin/zipinfo | जड़ | जड़ |
/usr/बिन/ज़िपनोट | जड़ | जड़ |
/usr/बिन/ज़िप | जड़ | जड़ |
/usr/bin/zipsplit /usr/bin/zjsdecode /usr/bin/zsoelim | जड़ मूल जड़ | जड़ मूल जड़ | |
फ़ाइल स्वामी: डेमॉन: 1 | फ़ाइल (रों) | ||
रूट : 1394 | फ़ाइल (रों) |
फ़ाइल समूह स्वामी: क्रोंटैब: 1 फ़ाइल(फ़ाइलें) डेमॉन: 1 फ़ाइल(एँ) एलपैडमिन: 1 फ़ाइल(एँ) मेल: 4 फ़ाइल(एँ) एमलोकेट: 1 फ़ाइल(एँ) रूट: 1380 फ़ाइल(एँ) छाया: 2 फ़ाइल (s) ssh : 1 फ़ाइल
ट्टी: 2 फ़ाइलें
utmp : 2 फ़ाइलें
#! / Bin / bash
#! / Bin / bash
# सारणी-2: फ़ाइल स्वामियों का मिलान करने के लिए सारणियों का उपयोग करें
घोषित करें -A फ़ाइलें फ़ाइल_समूह फ़ाइल_स्वामी समूह स्वामियों यदि [[ ! -d "$1" ]]; तब
इको "उपयोग: ऐरे-2 डीआईआर" >&2 निकास 1
fi
मेरे लिए "$1"/*; do मालिक=$(stat -c %U "$i") समूह=$(stat -c %G "$i") फ़ाइलें["$i"]='$i" file_owner["$i"]=$ स्वामी फ़ाइल_समूह["$i"]=$समूह ((++स्वामी[$स्वामी])) ((++समूह[$समूह]))
किया
# एकत्रित फ़ाइलों की सूची बनाएं
{ for i in "${files[@]}"; प्रिंटफ करें "%-40s %-10s %-10s\n" \
"$i" ${file_owner["$i"]} ${file_group["$i"]} हो गया } | क्रम से लगाना
# सारणी-2: फ़ाइल स्वामियों का मिलान करने के लिए सारणियों का उपयोग करें
घोषित करें -A फ़ाइलें फ़ाइल_समूह फ़ाइल_स्वामी समूह स्वामियों यदि [[ ! -d "$1" ]]; तब
इको "उपयोग: ऐरे-2 डीआईआर" >&2 निकास 1
fi
मेरे लिए "$1"/*; do मालिक=$(stat -c %U "$i") समूह=$(stat -c %G "$i") फ़ाइलें["$i"]='$i" file_owner["$i"]=$ स्वामी फ़ाइल_समूह["$i"]=$समूह ((++स्वामी[$स्वामी])) ((++समूह[$समूह]))
किया
# एकत्रित फ़ाइलों की सूची बनाएं
{ for i in "${files[@]}"; प्रिंटफ करें "%-40s %-10s %-10s\n" \
"$i" ${file_owner["$i"]} ${file_group["$i"]} हो गया } | क्रम से लगाना
यहां स्क्रिप्ट की एक सूची (पंक्ति संख्याओं के साथ) दी गई है:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
27
28
29
30
31
32
33
34
35
36
37
38
39
40
गूंज
गूंज
# मालिकों की सूची
प्रतिध्वनि "फ़ाइल स्वामी:"
{ मेरे लिए "${!owners[@]}" में; करना
printf "%-10s: %5d फ़ाइल(फ़ाइलें)\n" "$i" ${मालिक["$i"]} हो गया } | क्रम से लगाना
गूंज
# समूहों की सूची बनाएं
प्रतिध्वनि "फ़ाइल समूह स्वामी:"
{ for i in "${!groups[@]}"; करना
printf "%-10s: %5d फ़ाइल\n" "$i" ${groups["$i"]} हो गया } | क्रम से लगाना
# मालिकों की सूची
प्रतिध्वनि "फ़ाइल स्वामी:"
{ मेरे लिए "${!owners[@]}" में; करना
printf "%-10s: %5d फ़ाइल(फ़ाइलें)\n" "$i" ${मालिक["$i"]} हो गया } | क्रम से लगाना
गूंज
# समूहों की सूची बनाएं
प्रतिध्वनि "फ़ाइल समूह स्वामी:"
{ for i in "${!groups[@]}"; करना
printf "%-10s: %5d फ़ाइल\n" "$i" ${groups["$i"]} हो गया } | क्रम से लगाना
आइए इस स्क्रिप्ट की यांत्रिकी पर एक नज़र डालें:
रेखा 5: के साथ सहयोगी सारणी बनाई जानी चाहिए घोषित का उपयोग करके कमांड करें -A
विकल्प। इस स्क्रिप्ट में हम निम्नानुसार पाँच सरणियाँ बनाते हैं:
फ़ाइलों में निर्देशिका में फ़ाइलों के नाम शामिल हैं, फ़ाइल नाम द्वारा अनुक्रमित फ़ाइल_समूह में प्रत्येक फ़ाइल का समूह स्वामी शामिल है, फ़ाइल नाम द्वारा अनुक्रमित फ़ाइल_स्वामी में प्रत्येक फ़ाइल का स्वामी शामिल है, फ़ाइल नाम समूहों द्वारा अनुक्रमित में अनुक्रमित समूह स्वामियों से संबंधित फ़ाइलों की संख्या शामिल है इसमें अनुक्रमित स्वामी से संबंधित फ़ाइलों की संख्या शामिल है
पंक्तियाँ 7-10: यह देखने के लिए जाँच करें कि एक वैध निर्देशिका नाम एक स्थितीय पैरामीटर के रूप में पारित किया गया था। यदि नहीं, तो एक उपयोग संदेश प्रदर्शित होता है और स्क्रिप्ट 1 की निकास स्थिति के साथ बाहर निकल जाती है।
पंक्तियाँ 12-20: निर्देशिका में फ़ाइलों के माध्यम से लूप करें। का उपयोग स्टेट आदेश, पंक्तियाँ 13 और 14 फ़ाइल स्वामी और समूह स्वामी के नाम निकालती हैं और सरणी अनुक्रमणिका के रूप में फ़ाइल के नाम का उपयोग करके उनके संबंधित सरणियों (पंक्तियाँ 16, 17) को मान निर्दिष्ट करती हैं। इसी प्रकार फ़ाइल का नाम स्वयं निर्दिष्ट किया गया है फ़ाइलों सरणी (पंक्ति 15)।
पंक्तियाँ 18-19: फ़ाइल स्वामी और समूह स्वामी से संबंधित फ़ाइलों की कुल संख्या में एक की वृद्धि की जाती है।
पंक्तियाँ 22-27: फ़ाइलों की सूची आउटपुट है. यह "${array[@]}" पैरामीटर विस्तार का उपयोग करके किया जाता है जो प्रत्येक तत्व को एक अलग शब्द के रूप में मानते हुए सरणी तत्वों की पूरी सूची में विस्तारित होता है। यह इस संभावना को अनुमति देता है कि फ़ाइल नाम में एम्बेडेड रिक्त स्थान हो सकते हैं। यह भी ध्यान दें कि पूरा लूप ब्रेसिज़ में घिरा हुआ है और इस प्रकार एक समूह कमांड बनता है। यह लूप के संपूर्ण आउटपुट को पाइप में डालने की अनुमति देता है तरह आज्ञा। यह आवश्यक है क्योंकि सरणी तत्वों का विस्तार क्रमबद्ध नहीं है।
पंक्तियाँ 29-40: ये दो लूप फ़ाइल सूची लूप के समान हैं, सिवाय इसके कि वे "${!
array[@]}" विस्तार जो सरणी तत्वों की सूची के बजाय सरणी अनुक्रमणिका की सूची में विस्तारित होता है।