लूप के लिए दो प्रकार के बैश उपलब्ध हैं। एक मूल्यों की सूची के साथ "इन" कीवर्ड का उपयोग कर रहा है, दूसरा सी प्रोग्रामिंग जैसे सिंटैक्स का उपयोग कर रहा है।
यह लेख हमारी चल रही बैश ट्यूटोरियल श्रृंखला का हिस्सा है।
यह लूप के तरीकों के लिए दोनों बैश की व्याख्या करता है, और आपकी शेल स्क्रिप्ट में लूप के लिए बैश का उपयोग करने के तरीके पर 12 अलग-अलग उदाहरण प्रदान करता है।
भविष्य के संदर्भ के लिए इस लेख को बुकमार्क करें, क्योंकि यह एकमात्र लेख है जो आप उदाहरण के साथ लूप के लिए बैश का उपयोग करने के बारे में कभी भी उल्लेख करने की आवश्यकता होगी।
विधि 1:"इन" और मानों की सूची का उपयोग करके लूप के लिए बैश करें
सिंटैक्स:
for varname in list do command1 command2 .. done
उपरोक्त सिंटैक्स में:
- के लिए, में, करें और हो चुके कीवर्ड हैं
- “सूची” में मानों की सूची है। सूची एक चर हो सकती है जिसमें रिक्त स्थान द्वारा अलग किए गए कई शब्द हों। यदि सूची के लिए कथन में गायब है, तो यह स्थितिगत पैरामीटर लेता है जो शेल में पारित किया गया था।
- वर्नाम कोई भी बैश चर नाम है।
इस रूप में, कथन के लिए सूची में प्रत्येक आइटम के लिए एक बार शरीर में संलग्न आदेशों को निष्पादित करता है। उदाहरण के लिए, यदि मानों की सूची में 5 आइटम हैं, तो लूप के लिए सूची में प्रत्येक आइटम के लिए कुल 5 बार निष्पादित किया जाएगा। सूची से वर्तमान आइटम लूप के माध्यम से हर बार एक चर "varname" में संग्रहीत किया जाएगा। इस "वरनाम" को लूप के मुख्य भाग में संसाधित किया जा सकता है।
विधि 2:C जैसे सिंटैक्स का उपयोग करके लूप के लिए बैश करें
लूप के लिए दूसरा रूप "सी" प्रोग्रामिंग भाषा में लूप के समान है, जिसमें तीन अभिव्यक्तियां (प्रारंभिकरण, स्थिति और अद्यतन) हैं।
<केंद्र> केंद्र>for (( expr1; expr2; expr3 )) do command1 command2 .. done
कमांड सिंटैक्स के लिए उपरोक्त बैश में,
- पहले पुनरावृत्ति से पहले, expr1 का मूल्यांकन किया जाता है। यह आमतौर पर लूप के लिए वेरिएबल को इनिशियलाइज़ करने के लिए उपयोग किया जाता है।
- करने और किए के बीच के सभी कथनों को बार-बार निष्पादित किया जाता है जब तक कि expr2 का मान TRUE न हो।
- लूप के प्रत्येक पुनरावृत्ति के बाद, expr3 का मूल्यांकन किया जाता है। यह आमतौर पर लूप काउंटर को बढ़ाने के लिए प्रयोग किया जाता है।
निम्नलिखित 12 उदाहरण अलग-अलग तरीकों से लूप के लिए बैश करने का तरीका दिखाते हैं।
<एच3>1. “इन” कीवर्ड के बाद सूची के लिए स्थिर माननिम्नलिखित उदाहरण में, मानों की सूची (सोम, मंगल, बुध, गुरु और शुक्र) सीधे लूप के लिए बैश में कीवर्ड "इन" के बाद दी गई है।
$ cat for1.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" done $ ./for1.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
सावधानी: मानों की सूची को अल्पविराम (सोम, मंगल, बुध, गुरु, शुक्र) से अलग नहीं किया जाना चाहिए। अल्पविराम को मान के भाग के रूप में माना जाएगा। यानी "सोम" के बजाय, यह "सोम" का उपयोग करेगा, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।
$ cat for1-wrong1.sh i=1 for day in Mon, Tue, Wed, Thu, Fri do echo "Weekday $((i++)) : $day" done $ ./for1-wrong1.sh Weekday 1 : Mon, Weekday 2 : Tue, Weekday 3 : Wed, Weekday 4 : Thu, Weekday 5 : Fri
सावधानी: मूल्यों की सूची को दोहरे उद्धरण में संलग्न नहीं किया जाना चाहिए। ("सोम मंगल बुध गुरु शुक्र")। यदि आप दोहरे उद्धरण चिह्नों में संलग्न करते हैं, तो इसे एक एकल मान (5 भिन्न मानों के बजाय) के रूप में माना जाएगा, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।
$ cat for1-wrong2.sh i=1 for day in "Mon Tue Wed Thu Fri" do echo "Weekday $((i++)) : $day" done $ ./for1-wrong2.sh Weekday 1 : Mon Tue Wed Thu Fri<एच3>2. “इन” कीवर्ड के बाद सूची के लिए परिवर्तनीय
लूप के लिए सीधे मान प्रदान करने के बजाय, आप मानों को एक वेरिएबल में स्टोर कर सकते हैं, और "इन" कीवर्ड के बाद लूप के लिए वेरिएबल का उपयोग कर सकते हैं, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है।
$ cat for2.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in $weekdays do echo "Weekday $((i++)) : $day" done $ ./for2.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
सावधानी :सर्वोत्तम अभ्यास के रूप में, जब आप इसका उल्लेख कर रहे हों तो आपको हमेशा बैश चर को उद्धृत करना चाहिए। इस सर्वोत्तम अभ्यास नियम के कुछ अपवाद हैं। यह उनमें से एक है। यदि आप लूप के लिए इसमें चर को दोहराते हैं, तो मानों की सूची को एकल मान के रूप में माना जाएगा। बहुत से लोग इस जाल में फंस जाते हैं। सावधान रहें और लूप के लिए अपने वैरिएबल को डबल कोट न करें।
$ cat for2-wrong.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in "$weekdays" do echo "Weekday $((i++)) : $day" done $ ./for2-wrong.sh Weekday 1 : Mon Tue Wed Thu Fri<एच3>3. सूची निर्दिष्ट न करें; इसे स्थितीय मापदंडों से प्राप्त करें
यदि आप लूप के लिए बैश में मानों की किसी भी सूची के बाद "इन" कीवर्ड निर्दिष्ट नहीं करते हैं, तो यह स्थितीय मापदंडों (यानी शेल स्क्रिप्ट को दिए गए तर्क) का उपयोग करेगा।
$ cat for3.sh i=1 for day do echo "Weekday $((i++)) : $day" done $ ./for3.sh Mon Tue Wed Thu Fri Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
सावधानी: कृपया सावधान रहें यदि आप इस पद्धति का उपयोग करते हैं। आपको लूप के लिए "in" कीवर्ड शामिल नहीं करना चाहिए। यदि आप कीवर्ड "इन" को बिना किसी मान के छोड़ देते हैं, तो यह नीचे दिखाए गए अनुसार स्थितीय पैरामीटर का उपयोग नहीं करेगा। यह लूप के अंदर नहीं जाएगा। यानी लूप के लिए कभी भी निष्पादित नहीं किया जाएगा जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।
$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri
नोट :बैश स्थितीय मापदंडों के बारे में अधिक समझने के लिए हमारे पिछले लेख को देखें।
<एच3>4. "इन" कीवर्ड के बाद सूची मानों के रूप में यूनिक्स कमांड आउटपुटआप किसी भी UNIX / Linux कमांड के आउटपुट को लूप के लिए मानों की सूची के रूप में बैक-टिक `` में कमांड को संलग्न करके उपयोग कर सकते हैं जैसा कि नीचे दिखाया गया है।
$ cat for4.sh i=1 for username in `awk -F: '{print $1}' /etc/passwd` do echo "Username $((i++)) : $username" done $ ./for4.sh Username 1 : ramesh Username 2 : john Username 3 : preeti Username 4 : jason ..
5. लूप के लिए फ़ाइलों और निर्देशिकाओं के माध्यम से लूप करें
एक विशिष्ट निर्देशिका के तहत फाइलों और निर्देशिकाओं के माध्यम से लूप करने के लिए, बस उस निर्देशिका को सीडी दें, और नीचे दिखाए गए लूप के लिए * दें।
निम्न उदाहरण आपके होम डायरेक्टरी के अंतर्गत सभी फाइलों और निर्देशिकाओं के माध्यम से लूप करेगा।
$ cat for5.sh i=1 cd ~ for item in * do echo "Item $((i++)) : $item" done $ ./for5.sh Item 1 : positional-parameters.sh Item 2 : backup.sh Item 3 : emp-report.awk Item 4 : item-list.sed Item 5 : employee.db Item 8 : storage Item 9 : downloads
लूप के लिए बैश में * का उपयोग फ़ाइल ग्लोबिंग के समान है जिसका उपयोग हम linux कमांड लाइन में करते हैं जब हम ls कमांड (और अन्य कमांड) का उपयोग करते हैं।
उदाहरण के लिए, निम्नलिखित आपकी होम निर्देशिका के अंतर्गत सभी फाइलों और निर्देशिकाओं को प्रदर्शित करेगा। यह वह अवधारणा है जिसका उपयोग उपरोक्त for5.sh उदाहरण में किया गया है।
cd ~ ls *
निम्नलिखित सभी *.conf फ़ाइल प्रदर्शित करेगा जो /etc निर्देशिका के अंतर्गत a, b, या, c या d से शुरू होती है।
$ ls -1 /etc/[abcd]*.conf /etc/asound.conf /etc/autofs_ldap_auth.conf /etc/cas.conf /etc/cgconfig.conf /etc/cgrules.conf /etc/dracut.conf
ऊपर दिए गए ls कमांड में उपयोग किया गया वही तर्क, लूप के लिए बैश में उपयोग किया जा सकता है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।
$ cat for5-1.sh i=1 for file in /etc/[abcd]*.conf do echo "File $((i++)) : $file" done $ ./for5-1.sh File 1 : /etc/asound.conf File 2 : /etc/autofs_ldap_auth.conf File 3 : /etc/cas.conf File 4 : /etc/cgconfig.conf File 5 : /etc/cgrules.conf File 6 : /etc/dracut.conf<एच3>6. लूप के लिए ब्रेक आउट करें
जैसा कि नीचे दिखाया गया है, आप 'ब्रेक' कमांड का उपयोग करके लूप के लिए बाहर निकल सकते हैं।
$ cat for6.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" if [ $i -eq 3 ]; then break; fi done $ ./for6.sh Weekday 1 : Mon Weekday 2 : Tue<एच3>7. लूप के ऊपर से जारी रखें
कुछ शर्तों के तहत, आप लूप के लिए शेष कमांड को अनदेखा कर सकते हैं, और नीचे दिखाए गए अनुसार जारी रखें कमांड का उपयोग करके लूप को फिर से ऊपर से (सूची में अगले मान के लिए) जारी रख सकते हैं।
निम्न उदाहरण शनि और सूर्य में "(सप्ताहांत)" और शेष दिनों में "(सप्ताह का दिन)" जोड़ता है।
$ cat for7.sh i=1 for day in Mon Tue Wed Thu Fri Sat Sun do echo -n "Day $((i++)) : $day" if [ $i -eq 7 -o $i -eq 8 ]; then echo " (WEEKEND)" continue; fi echo " (weekday)" done $ ./for7.sh Day 1 : Mon (weekday) Day 2 : Tue (weekday) Day 3 : Wed (weekday) Day 4 : Thu (weekday) Day 5 : Fri (weekday) Day 6 : Sat (WEEKEND) Day 7 : Sun (WEEKEND)
8. C प्रोग्राम सिंटैक्स का उपयोग करके लूप के लिए बैश करें
यह उदाहरण लूप के लिए बैश की दूसरी विधि का उपयोग करता है, जो लूप सिंटैक्स के लिए सी के समान है। निम्न उदाहरण लूप के लिए बैश सी-शैली का उपयोग करके 5 यादृच्छिक संख्या उत्पन्न करता है।
$ cat for8.sh for (( i=1; i <= 5; i++ )) do echo "Random number $i: $RANDOM" done $ ./for8.sh Random number 1: 23320 Random number 2: 5070 Random number 3: 15202 Random number 4: 23861 Random number 5: 23435
9. लूप के लिए अनंत बैश
जब आप लूप के लिए बैश सी-स्टाइल में प्रारंभ, स्थिति और वृद्धि प्रदान नहीं करते हैं, तो यह अनंत लूप बन जाएगा। लूप को रोकने के लिए आपको Ctrl-C दबाना होगा।
$ cat for9.sh i=1; for (( ; ; )) do sleep $i echo "Number: $((i++))" done
जैसा कि हमने ऊपर कहा, लूप उदाहरण के लिए अनंत बैश से बाहर निकलने के लिए Ctrl-C दबाएं।
$ ./for9.sh Number: 1 Number: 2 Number: 3<एच3>10. लूप के लिए बैश सी-स्टाइल में अल्पविराम का उपयोग करना
बैश सी-स्टाइल लूप में, स्थिति में उपयोग किए जाने वाले मान को बढ़ाने के अलावा, आप नीचे दिखाए गए अनुसार कुछ अन्य मान भी बढ़ा सकते हैं।
इनिशियलाइज़ सेक्शन में, और लूप के लिए बैश सी-स्टाइल के इंक्रीमेंट सेक्शन में, आप नीचे दिखाए गए कॉमा से अलग करके कई मान प्राप्त कर सकते हैं।
लूप के लिए निम्नलिखित चर i का उपयोग करके कुल 5 बार निष्पादित किया जाता है। हालांकि वेरिएबल j 5 से शुरू होता है, और हर बार लूप के निष्पादित होने पर 5 से इंक्रीमेंट मिलता है।
$ cat for10.sh for ((i=1, j=10; i <= 5 ; i++, j=j+5)) do echo "Number $i: $j" done $ ./for10.sh Number 1: 10 Number 2: 15 Number 3: 20 Number 4: 25 Number 5: 30
11. "इन" कीवर्ड के बाद संख्याओं की श्रेणी
आप ब्रेस विस्तार का उपयोग करके "इन" लूप में संख्याओं की श्रेणी का उपयोग करके लूप कर सकते हैं।
निम्न उदाहरण 1 से 10 के मानों का उपयोग करके 10 बार लूप करता है।
$ cat for11.sh for num in {1..10} do echo "Number: $num" done $ ./for11.sh Number: 1 Number: 2 Number: 3 Number: 4 Number: 5 ...<एच3>12. "इन" कीवर्ड के बाद वृद्धि के साथ संख्याओं की श्रेणी
निम्न उदाहरण 1 से 10 के मान का उपयोग करते हुए 2 की वृद्धि के साथ 5 बार लूप करता है। यानी यह 1 से शुरू होता है, और 2 से बढ़ता रहता है, जब तक कि यह 10 तक नहीं पहुंच जाता।
$ cat for12.sh for num in {1..10..2} do echo "Number: $num" done $ ./for12.sh Number: 1 Number: 3 Number: 5 Number: 7 Number: 9
PS: अपने भविष्य के संदर्भ के लिए इस लेख को बुकमार्क करना न भूलें।