लिनक्स में बैश फॉर लूप्स के बारे में आपको जो कुछ पता होना चाहिए

लिनक्स में बैश फॉर लूप्स के बारे में आपको जो कुछ पता होना चाहिए

बैश स्क्रिप्ट स्वचालित कार्यों का एक अत्यधिक कुशल साधन है, विशेष रूप से वे जो अन्य मौजूदा कार्यक्रमों का लाभ उठाते हैं। इस स्वचालन को अक्सर एक समान ऑपरेशन को कई बार दोहराने की आवश्यकता होती है, जो ठीक वहीं है पाश के लिए अपने में आ जाता है।





लिनक्स और मैक सिस्टम प्रशासक आमतौर पर टर्मिनल के माध्यम से स्क्रिप्टिंग से परिचित होते हैं, लेकिन विंडोज उपयोगकर्ता भी कर सकते हैं Linux के लिए Windows सबसिस्टम के साथ कार्रवाई शुरू करें .





बैश स्क्रिप्ट कैसे काम करती है

बैश स्क्रिप्ट केवल एक सादा पाठ फ़ाइल है जिसमें कमांड की एक श्रृंखला होती है जिसे बैश शेल पढ़ और निष्पादित कर सकता है। प्री-कैटालिना मैकओएस और अधिकांश लिनक्स वितरण में बैश डिफ़ॉल्ट शेल है।





यदि आपने पहले कभी शेल स्क्रिप्ट के साथ काम नहीं किया है, तो आपको सबसे सरल मामले से शुरुआत करनी चाहिए। यह आपको स्क्रिप्ट के निर्माण और उसके निष्पादन सहित प्रमुख अवधारणाओं का अभ्यास करने की अनुमति देगा।

सबसे पहले, एक सुविधाजनक स्थान पर निम्न फ़ाइल बनाएं (आदर्श रूप से, एक टर्मिनल खोलें और पहले वांछित निर्देशिका में नेविगेट करें):



#!/bin/bash
echo 'Hello, World'

पहली पंक्ति बताती है कि जो कुछ भी इस प्रोग्राम को चलाता है उसे कैसे चलाना है (यानी बैश दुभाषिया का उपयोग करना)। दूसरा सिर्फ एक कमांड है, जैसा कि आप कमांड लाइन पर दर्ज कर सकते हैं। उस फ़ाइल को इस रूप में सहेजें hello_world.sh , फिर:

$ chmod +x hello_world.sh
$ ./hello_world.sh

NS चामोद पहली पंक्ति पर कमांड फ़ाइल को निष्पादन योग्य बनाता है, जिसका अर्थ है कि इसे दूसरी पंक्ति की तरह अपना नाम लिखकर चलाया जा सकता है।





यदि आप अपने टर्मिनल में हैलो, वर्ल्ड शब्द एक लाइन पर मुद्रित दिखाई देते हैं, तो सब कुछ आवश्यकतानुसार काम कर रहा है।

लूप्स कैसे काम करते हैं

सामान्य प्रोग्रामिंग में, लूप के लिए दो मुख्य प्रकार होते हैं: संख्यात्मक तथा प्रत्येक के लिए . संख्यात्मक प्रकार पारंपरिक रूप से सबसे आम है, लेकिन बैश उपयोग में, यह आमतौर पर दूसरा तरीका है।





लूप के लिए संख्यात्मक आमतौर पर एक पूर्णांक पर ध्यान केंद्रित करते हैं जो निर्धारित करता है कि कितने पुनरावृत्तियों को किया जाएगा, उदाहरण के लिए:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

यह एक परिचित-लुकिंग लूप है जो ठीक 100 बार पुनरावृति करेगा, जब तक कि i को लूप के भीतर नहीं बदला जाता है, या कोई अन्य कथन लूप के निष्पादन को रोक देता है।

फ़ोरैच लूप, इसके विपरीत, सूचियों या सरणियों जैसी संरचनाओं पर काम करते हैं, और उस संग्रह के भीतर प्रत्येक आइटम के लिए पुनरावृति करते हैं:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

कुछ भाषाएं थोड़ा अलग सिंटैक्स का उपयोग करती हैं जो संग्रह और आइटम के क्रम को बदल देती है:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

लूप्स में के लिए

बैश में, foreach—or में लिए -लूप अधिक सामान्य है। मूल वाक्यविन्यास है, बस:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

उदाहरण के लिए, तीन स्पष्ट रूप से नामित फ़ाइलों के माध्यम से पुनरावृति करने के लिए:

मेरी डिस्क का 100 प्रतिशत उपयोग क्यों किया जा रहा है
for file in one.c two.c three.c
do
ls '$file'
done

यदि ऐसी फ़ाइलें वर्तमान निर्देशिका में मौजूद हैं, तो इस स्क्रिप्ट से आउटपुट होगा:

one.c
two.c
three.c

फ़ाइलों के एक निश्चित सेट के बजाय, सूची को ग्लोब पैटर्न (वाइल्डकार्ड सहित - विशेष वर्ण जो अन्य वर्णों का प्रतिनिधित्व करते हैं) के माध्यम से प्राप्त किया जा सकता है। निम्नलिखित उदाहरण में, लूप के लिए सभी फाइलों (वर्तमान निर्देशिका में) में पुनरावृति होती है, जिनके नाम '.xml' में समाप्त होते हैं:

for file in *.xml
do
ls -l '$file'
done

यहाँ कुछ उदाहरण आउटपुट है:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

यह बहुत लंबे समय तक चलने वाले तरीके की तरह लग सकता है:

$ ls -l *.xml

लेकिन एक महत्वपूर्ण अंतर है: लूप के लिए निष्पादित करता है रास कार्यक्रम 2 अलग-अलग बार, एक फ़ाइल नाम के साथ इसे हर बार पास किया गया। अलग ls उदाहरण में, ग्लोब पैटर्न (*.xml) पहले फ़ाइल नामों से मेल खाता है और फिर उन सभी को अलग-अलग कमांड-लाइन पैरामीटर के रूप में, एक उदाहरण में भेजता है रास .

यहां एक उदाहरण दिया गया है जो का उपयोग करता है स्वागत (शब्द गणना) अंतर को और अधिक स्पष्ट करने के लिए कार्यक्रम:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

NS स्वागत प्रोग्राम प्रत्येक फ़ाइल में अलग-अलग पंक्तियों की संख्या की गणना करता है, फिर उन सभी में कुल संख्या को प्रिंट करता है। इसके विपरीत, यदि स्वागत लूप के लिए काम करता है:

for file in *.xml
do
wc -l $file
done

आपको अब भी प्रत्येक फ़ाइल की संख्या दिखाई देगी:

44 feed.xml
231 sitemap.xml

लेकिन कोई समग्र सारांश कुल नहीं है क्योंकि स्वागत अलगाव में चलाया जाता है, हर बार लूप पुनरावृत्त होता है।

जब कोई सूची सूची नहीं है

लूप के लिए व्यवहार करते समय एक बहुत ही आसान और सामान्य गलती है, जिस तरह से बैश उद्धृत तर्कों / तारों को संभालता है। फाइलों की सूची के माध्यम से लूपिंग इस तरह की जानी चाहिए:

for file in one.c two.c

एसा नहीँ:

for file in 'one.c two.c'

दूसरा उदाहरण फ़ाइल नामों को दोहरे-उद्धरणों में संलग्न करता है जिसके परिणामस्वरूप केवल एक पैरामीटर वाली सूची होती है; लूप के लिए केवल एक बार निष्पादित होगा। ऐसे मामलों में एक चर का उपयोग करके इस समस्या से बचा जा सकता है:

FILES='one.c two.c'
for file in $FILES
do
...
done

ध्यान दें कि परिवर्तनीय घोषणा को अपने मूल्य को डबल-कोट्स में संलग्न करने की आवश्यकता है!

वाईफाई कनेक्ट है लेकिन कोई इंटरनेट एक्सेस नहीं है विंडोज 7

एक सूची के बिना

के माध्यम से पुनरावृति के लिए कुछ भी नहीं के साथ, लूप के लिए जो भी कमांड-लाइन तर्क स्क्रिप्ट को प्रदान किए जाते हैं, उस पर संचालित होता है। उदाहरण के लिए, यदि आपके पास नाम की एक स्क्रिप्ट है args.sh निम्नलिखित युक्त:

#!/bin/sh
for a
do
echo $a
done

फिर args.sh निष्पादित करने से आपको निम्नलिखित मिलेगा:

$ ./args.sh one two three
one
two
three

बैश इस मामले को पहचानता है और व्यवहार करता है एक काम के लिए के समकक्ष के रूप में $@ do . में a के लिए जहां $@ कमांड लाइन तर्कों का प्रतिनिधित्व करने वाला एक विशेष चर है।

लूप के लिए एक पारंपरिक न्यूमेरिक का अनुकरण करना

बैश स्क्रिप्ट अक्सर फाइलों की सूची या अन्य कमांड से आउटपुट की लाइनों से निपटती है, इसलिए लूप के प्रकार के लिए सामान्य है। हालांकि, पारंपरिक सी-स्टाइल ऑपरेशन अभी भी समर्थित है:

for (( i=1; i<=5; i++ ))
do
echo $i
done

यह तीन भागों वाला क्लासिक रूप है जिसमें:

  1. जब लूप पहली बार सामने आता है तो एक चर प्रारंभ किया जाता है (i=1)
  2. लूप तब तक जारी रहता है जब तक स्थिति (i .)<=5) is true
  3. हर बार लूप के आसपास, चर बढ़ा हुआ होता है (i++)

दो मानों के बीच पुनरावृति एक सामान्य पर्याप्त आवश्यकता है कि एक छोटा, थोड़ा कम भ्रमित करने वाला विकल्प हो:

for i in {1..5}
do
echo $i
done

ब्रेस विस्तार जो प्रभावी रूप से लूप के लिए उपरोक्त का अनुवाद करता है:

for i in 1 2 3 4

ब्रेक के साथ फाइनर लूप कंट्रोल और जारी रखें

लूप के लिए अधिक जटिल अक्सर जल्दी से बाहर निकलने के तरीके की आवश्यकता होती है या बदले में अगले मान के साथ मुख्य लूप को तुरंत पुनरारंभ करना होता है। ऐसा करने के लिए, बैश ब्रेक उधार लेता है और बयान जारी रखता है जो अन्य प्रोग्रामिंग भाषाओं में आम हैं। यहां एक उदाहरण दिया गया है जो 100 वर्णों से अधिक लंबी पहली फ़ाइल खोजने के लिए दोनों का उपयोग करता है:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

यहां लूप के लिए वर्तमान निर्देशिका में सभी फाइलों पर काम करता है। यदि फ़ाइल एक नियमित फ़ाइल नहीं है (उदाहरण के लिए यदि यह एक निर्देशिका है), तो जारी बयान का उपयोग लूप को अगली फ़ाइल के साथ फिर से शुरू करने के लिए किया जाता है। यदि यह एक नियमित फ़ाइल है, तो दूसरा सशर्त ब्लॉक यह निर्धारित करेगा कि इसमें 100 से अधिक वर्ण हैं या नहीं। यदि ऐसा है, तो लूप के लिए तुरंत छोड़ने के लिए ब्रेक स्टेटमेंट का उपयोग किया जाता है (और स्क्रिप्ट के अंत तक पहुंचें)।

निष्कर्ष

बैश स्क्रिप्ट एक फ़ाइल है जिसमें निर्देशों का एक सेट होता है जिसे निष्पादित किया जा सकता है। लूप के लिए एक स्क्रिप्ट के हिस्से को कई बार दोहराया जा सकता है। चर, बाहरी कमांड और ब्रेक एंड कंटिन्यू स्टेटमेंट के उपयोग के साथ, बैश स्क्रिप्ट अधिक जटिल तर्क लागू कर सकती हैं और कार्यों की एक विस्तृत श्रृंखला को पूरा कर सकती हैं।

साझा करना साझा करना कलरव ईमेल क्या यह विंडोज 11 में अपग्रेड करने लायक है?

विंडोज़ को नया रूप दिया गया है। लेकिन क्या यह आपको विंडोज 10 से विंडोज 11 में शिफ्ट होने के लिए मनाने के लिए काफी है?

आगे पढ़िए
संबंधित विषय
  • प्रोग्रामिंग
  • लिनक्स
लेखक के बारे में बॉबी जैक(58 लेख प्रकाशित)

बॉबी एक प्रौद्योगिकी उत्साही हैं जिन्होंने दो दशकों तक एक सॉफ्टवेयर डेवलपर के रूप में काम किया। उन्हें गेमिंग का शौक है, स्विच प्लेयर मैगज़ीन में समीक्षा संपादक के रूप में काम कर रहे हैं, और ऑनलाइन प्रकाशन और वेब विकास के सभी पहलुओं में डूबे हुए हैं।

बॉबी जैक . की अन्य फ़िल्में-टीवी शो

हमारे न्यूज़लेटर की सदस्यता लें

तकनीकी युक्तियों, समीक्षाओं, निःशुल्क ई-पुस्तकों और अनन्य सौदों के लिए हमारे न्यूज़लेटर से जुड़ें!

सब्सक्राइब करने के लिए यहां क्लिक करें