Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

बैश फॉर लूप्स मास्टर करें: Linux शेल स्क्रिप्टिंग के लिए 12 आवश्यक उदाहरण

दो प्रकार के बैश फॉर लूप्स उपलब्ध हैं। एक "in" कीवर्ड का उपयोग करके मानों की सूची के साथ, दूसरा C प्रोग्रामिंग जैसे सिंटैक्स का उपयोग करके।

यह लेख हमारी चल रही बैश ट्यूटोरियल श्रृंखला का हिस्सा है।

यह बैश फॉर लूप के दोनों तरीकों की व्याख्या करता है, और आपके शेल स्क्रिप्ट में बैश फॉर लूप का उपयोग करने के 12 अलग-अलग उदाहरण प्रदान करता है।

भविष्य के संदर्भ के लिए इस लेख को बुकमार्क करें, क्योंकि यह एकमात्र लेख है जिसे आपको बैश फॉर लूप्स का उपयोग उदाहरणों के साथ कैसे करना है, इस पर संदर्भित करने की कभी आवश्यकता होगी।

विधि 1: "in" और मानों की सूची का उपयोग करके बैश फॉर लूप

सिंटैक्स:

for varname in list do command1 command2 .. done

उपरोक्त सिंटैक्स में:

  • for, in, do और done कीवर्ड हैं
  • "list" में मानों की सूची होती है। सूची एक वेरिएबल हो सकती है जिसमें स्पेस द्वारा अलग किए गए कई शब्द होते हैं। यदि फॉर स्टेटमेंट में list अनुपस्थित है, तो यह शेल में पास किए गए पोजिशनल पैरामीटर लेता है।
  • varname कोई भी बैश वेरिएबल नाम है।

इस रूप में, फॉर स्टेटमेंट सूची में प्रत्येक आइटम के लिए एक बार बॉडी में संलग्न कमांड को निष्पादित करता है। उदाहरण के लिए, यदि मानों की सूची में 5 आइटम हैं, तो फॉर लूप कुल 5 बार निष्पादित होगा, सूची में प्रत्येक आइटम के लिए एक बार। सूची से वर्तमान आइटम को प्रत्येक बार लूप के माध्यम से "varname" वेरिएबल में संग्रहीत किया जाएगा। इस "varname" को फॉर लूप के बॉडी में संसाधित किया जा सकता है।

विधि 2: C जैसे सिंटैक्स का उपयोग करके बैश फॉर लूप

फॉर लूप का दूसरा रूप "C" प्रोग्रामिंग भाषा में फॉर लूप के समान है, जिसमें तीन अभिव्यक्तियां हैं (आरंभीकरण, स्थिति और अद्यतन)।

for (( expr1; expr2; expr3 )) do command1 command2 .. done

उपरोक्त बैश फॉर कमांड सिंटैक्स में,

  • पहली पुनरावृत्ति से पहले, expr1 का मूल्यांकन किया जाता है। यह आमतौर पर लूप के लिए वेरिएबल आरंभ करने के लिए उपयोग किया जाता है।
  • do और done के बीच के सभी स्टेटमेंट बार-बार निष्पादित होते हैं जब तक expr2 का मान TRUE है।
  • लूप के प्रत्येक पुनरावृत्ति के बाद, expr3 का मूल्यांकन किया जाता है। यह आमतौर पर लूप काउंटर बढ़ाने के लिए उपयोग किया जाता है।

निम्नलिखित 12 उदाहरण दिखाते हैं कि बैश फॉर लूप्स का विभिन्न तरीकों से उपयोग कैसे करें।

1. "in" कीवर्ड के बाद स्थिर मानों के लिए सूची

निम्नलिखित उदाहरण में, मानों की सूची (Mon, Tue, Wed, Thu और Fri) को बैश फॉर लूप में कीवर्ड "in" के बाद सीधे दिया गया है।

$ 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

सावधान: मानों की सूची को कॉमा से अलग नहीं किया जाना चाहिए (Mon, Tue, Wed, Thu, Fri)। कॉमा को मान के हिस्से के रूप में माना जाएगा। यानी "Mon" के बजाय, यह "Mon," को मान के रूप में उपयोग करेगा जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।

$ 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

सावधान: मानों की सूची को डबल कोट्स में संलग्न नहीं किया जाना चाहिए। ("Mon Tue Wed Thu 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

2. "in" कीवर्ड के बाद सूची के लिए वेरिएबल

फॉर लूप में सीधे मान प्रदान करने के बजाय, आप मानों को एक वेरिएबल में स्टोर कर सकते हैं, और "in" कीवर्ड के बाद फॉर लूप में वेरिएबल का उपयोग कर सकते हैं, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है।

$ 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. सूची निर्दिष्ट न करें; इसे पोजिशनल पैरामीटर्स से प्राप्त करें

यदि आप बैश फॉर लूप में "in" कीवर्ड के बाद किसी भी मान की सूची निर्दिष्ट नहीं करते हैं, तो यह पोजिशनल पैरामीटर्स का उपयोग करेगा (यानी शेल स्क्रिप्ट को पास किए गए आर्गुमेंट्स)।

$ 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" शामिल नहीं करना चाहिए। यदि आप कीवर्ड "in" को बिना किसी मान के छोड़ देते हैं, तो यह पोजिशनल पैरामीटर का उपयोग नहीं करेगा जैसा कि नीचे दिखाया गया है। यह लूप के अंदर नहीं जाएगा। यानी फॉर लूप कभी निष्पादित नहीं होगा जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।

$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri

नोट: बैश पोजिशनल पैरामीटर्स को समझने के लिए हमारे पहले के लेख देखें।

4. "in" कीवर्ड के बाद सूची मानों के रूप में यूनिक्स कमांड आउटपुट

आप किसी भी 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. फॉर लूप में फाइलों और डायरेक्टरी के माध्यम से लूप करें

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

निम्नलिखित उदाहरण आपकी होम डायरेक्टरी के तहत सभी फाइलों और डायरेक्टरी के माध्यम से लूप करेगा।

$ 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

बैश फॉर लूप में * का उपयोग लिनक्स कमांड लाइन में ls कमांड (और अन्य कमांड) का उपयोग करते समय हम जिस फाइल ग्लोबिंग का उपयोग करते हैं, उसके समान है।

उदाहरण के लिए, निम्नलिखित आपकी होम डायरेक्टरी के तहत सभी फाइलों और डायरेक्टरी को प्रदर्शित करेगा। यह अवधारणा ऊपर दिए गए for5.sh उदाहरण में उपयोग की गई है।

cd ~ ls *

निम्नलिखित /etc डायरेक्टरी के तहत a, b, c, या d से शुरू होने वाली सभी *.conf फाइल को प्रदर्शित करेगा।

$ 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

6. फॉर लूप से बाहर निकलें

आप 'break' कमांड का उपयोग करके फॉर लूप से बाहर निकल सकते हैं जैसा कि नीचे दिखाया गया है।

$ 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

7. फॉर लूप के शीर्ष से जारी रखें

कुछ शर्तों के तहत, आप फॉर लूप में बाकी कमांड को अनदेखा कर सकते हैं, और लूप को शीर्ष से फिर से जारी रख सकते हैं (सूची में अगले मान के लिए), continue कमांड का उपयोग करके जैसा कि नीचे दिखाया गया है।

निम्नलिखित उदाहरण Sat और Sun में "(WEEKEND)" जोड़ता है, और बाकी दिनों में "(weekday)"।

$ 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 प्रोग्राम सिंटैक्स का उपयोग करके बैश फॉर लूप

यह उदाहरण बैश फॉर लूप की दूसरी विधि का उपयोग करता है, जो C फॉर लूप सिंटैक्स के समान है। निम्नलिखित उदाहरण बैश 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. अनंत बैश फॉर लूप

जब आप बैश C-स्टाइल फॉर लूप में प्रारंभ, स्थिति, और वृद्धि प्रदान नहीं करते हैं, तो यह अनंत लूप बन जाएगा। लूप को रोकने के लिए आपको 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

10. बैश C-स्टाइल फॉर लूप में कॉमा का उपयोग

बैश c-स्टाइल लूप में, कंडीशन में उपयोग किए जाने वाले मान को बढ़ाने के अलावा, आप कुछ अन्य मान भी बढ़ा सकते हैं जैसा कि नीचे दिखाया गया है।

बैश C-स्टाइल फॉर लूप के आरंभीकरण खंड, और वृद्धि खंड में, आप कॉमा से अलग करके कई मान रख सकते हैं जैसा कि नीचे दिखाया गया है।

निम्नलिखित फॉर लूप वेरिएबल 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. "in" कीवर्ड के बाद संख्याओं की रेंज

आप ब्रेस एक्सपैंशन का उपयोग करके फॉर लूप "in" में संख्याओं की रेंज के माध्यम से लूप कर सकते हैं।

निम्नलिखित उदाहरण मानों 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 ...

12. "in" कीवर्ड के बाद वृद्धि के साथ संख्याओं की रेंज

निम्नलिखित उदाहरण मानों 1 से 10 का उपयोग करके, 2 की वृद्धि के साथ 5 बार लूप करता है। यानी यह 1 से शुरू होता है, और 10 तक पहुंचने तक 2 से बढ़ता रहता है।

$ 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: भविष्य के संदर्भ के लिए इस लेख को बुकमार्क करना न भूलें।

  1. WSL के साथ Windows 10 पर Bash इंस्टॉल और उपयोग करें - चरण-दर-चरण ट्यूटोरियल WSL के साथ Windows 10 पर Bash इंस्टॉल और उपयोग करें - चरण-दर-चरण ट्यूटोरियल

    यहां बताया गया है कि Windows पर Linux शेल को कैसे सेट अप और उपयोग करें – Windows Subsystem for Linux (WSL) का उपयोग करके। यह ट्यूटोरियल 2020 के बाद से Windows 10 के अप-टू-डेट संस्करणों के लिए अभिप्रेत है। मैं Windows 10 के पुराने संस्करणों या Windows 8/7/XP/3.1 के लिए अन्य विधियों पर WSL का उपयोग कै

  1. Linux Bash प्रॉम्प्ट को बेहतर बनाने के लिए 10 व्यावसायिक PS1 अनुकूलन Linux Bash प्रॉम्प्ट को बेहतर बनाने के लिए 10 व्यावसायिक PS1 अनुकूलन

    पिछले लेख में, हमने Linux पर्यावरण वेरिएबल्स PS[1-4] और PROMPT_COMMAND पर चर्चा की थी। यदि प्रभावी ढंग से उपयोग किया जाए, तो PS1 कमांड प्रॉम्प्ट पर मूल्यवान जानकारी प्रदान कर सकता है। टॉम्ब रेडर में, एंजेलिना जोली के पास रहस्य को शैली में सुलझाने के लिए उसकी उंगलियों पर सभी गैजेट्स और हथियार हैं। जब

  1. Bash स्क्रिप्टिंग में मास्टर करें: 5 वास्तविक-विश्व उदाहरणों के साथ एक व्यावहारिक परिचय Bash स्क्रिप्टिंग में मास्टर करें: 5 वास्तविक-विश्व उदाहरणों के साथ एक व्यावहारिक परिचय

    हमारे चल रहे Unix Sed और Unix Awk सीरीज़ के समान, हम Bash स्क्रिप्टिंग पर कई लेख पोस्ट करेंगे, जो व्यावहारिक उदाहरणों के साथ सभी Bash स्क्रिप्टिंग तकनीकों को कवर करेंगे। शेल एक प्रोग्राम है, जो उपयोगकर्ता कमांड्स की व्याख्या करता है। कमांड्स या तो उपयोगकर्ता द्वारा सीधे दर्ज की जाती हैं या शेल स्क्र