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

Bash लूप्स में मास्टर करें: For, While, और Until उदाहरण समझाए गए

लूपिंग स्टेटमेंट्स का उपयोग किसी प्रोग्राम को बार-बार एक स्टेटमेंट निष्पादित करने के लिए मजबूर करने के लिए किया जाता है। निष्पादित स्टेटमेंट को लूप बॉडी कहा जाता है।

लूप्स तब तक निष्पादित होते हैं जब तक नियंत्रण अभिव्यक्ति का मान 0 नहीं हो जाता। नियंत्रण अभिव्यक्ति कोई भी स्केलर डेटा प्रकार हो सकती है।

शेल भाषा कई पुनरावृत्ति या लूपिंग स्टेटमेंट्स भी प्रदान करती है। इस लेख में आइए कुछ उदाहरणों का उपयोग करके bash द्वारा प्रदान किए गए लूपिंग स्टेटमेंट्स की समीक्षा करें।

Bash निम्नलिखित तीन प्रकार के लूपिंग स्टेटमेंट का समर्थन करता है

  1. For लूप
  2. While लूप
  3. Until लूप

यह लेख चल रही Bash ट्यूटोरियल सीरीज़ का हिस्सा है।

लूप्स नेस्टेड हो सकते हैं। किसी भी अन्य प्रोग्रामिंग भाषा की तरह, bash भी वर्तमान लूप से बाहर निकलने के लिए break स्टेटमेंट और लूप स्टेटमेंट के अगले पुनरावृत्ति को फिर से शुरू करने के लिए continue स्टेटमेंट का समर्थन करता है।

Bash For लूप - पहली विधि

For लूप्स का उपयोग आमतौर पर तब किया जाता है जब पुनरावृत्तियों की संख्या bash लूप में प्रवेश करने से पहले ज्ञात होती है। Bash दो प्रकार के for लूप का समर्थन करता है। Bash for लूप का पहला रूप है:

for varname in list do commands ##लूप का बॉडी done

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

  • for, in, do और done कीवर्ड हैं
  • List कोई भी सूची है जिसमें आइटम्स की सूची है
  • varname कोई भी Bash वेरिएबल नाम है।

इस रूप में, for स्टेटमेंट लिस्ट में प्रत्येक आइटम के लिए बॉडी में संलग्न कमांड को एक बार निष्पादित करता है। लिस्ट से वर्तमान आइटम प्रत्येक बार लूप के माध्यम से "varname" वेरिएबल में संग्रहीत किया जाएगा। इस varname को लूप के बॉडी में संसाधित किया जा सकता है। यह लिस्ट एक वेरिएबल हो सकती है जिसमें स्पेस द्वारा अलग किए गए कई शब्द होते हैं। यदि for स्टेटमेंट में लिस्ट गायब है, तो यह शेल में पास किए गए स्थितिगत पैरामीटर्स को लेता है।

Bash For लूप उदाहरण 1. सभी Zip फ़ाइलों को अनज़िप करें

निम्नलिखित उदाहरण रूट निर्देशिका में "*.zip*" से मेल खाने वाली फ़ाइलों की सूची ढूंढता है, और उसी स्थान पर एक नई निर्देशिका बनाता है जहां zip फ़ाइल मौजूद है, और zip फ़ाइल सामग्री को अनज़िप करता है।

# cat zip_unzip.sh #! /bin/bash # फ़ाइलें ढूंढें जिनमें .zip है for file in `find /root -name "*.zip*" -type f` do # एक्सटेंशन .zip को छोड़ें dirname=`echo ${file} | awk -F'.' '{print $1}'` # निर्देशिका बनाएं mkdir $dirname # zip फ़ाइल कॉपी करें cp ${file} ${dirname} cd $dirname # नई बनाई गई निर्देशिका से zip फ़ाइल अनज़िप करें unzip ${dirname}/$(echo ${file##/*/}) done
  • इस उदाहरण में find कमांड फ़ाइलों की सूची लौटाता है, जिससे प्रत्येक फ़ाइल को लूप के माध्यम से संसाधित किया जाएगा।
  • प्रत्येक आइटम के लिए, यह zip फ़ाइल के नाम के साथ निर्देशिका बनाता है, zip फ़ाइल को नई बनाई गई निर्देशिका में कॉपी करता है और वहां से zip फ़ाइल को अनज़िप करता है।
  • echo स्टेटमेंट, echo ${file##/*/} आपको केवल फ़ाइल नाम देता है न कि पथ।
# ./zip_unzip.sh Archive: /root/test2/test2.zip extracting: t1/p extracting: t1/q extracting: t1/r extracting: t1/s extracting: t1/t extracting: t1/u extracting: t1/v Archive: /root/test1/test1.zip extracting: t/a extracting: t/b extracting: t/c extracting: t/d extracting: t/e

Bash लूप के समान, Awk भी for लूप और while लूप प्रदान करता है जैसा कि हमने अपने Awk While और For लूप लेख में चर्चा की थी।

Bash For लूप - दूसरी विधि

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

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

निम्नलिखित उदाहरण n संख्या में यादृच्छिक संख्याएं जनरेट करता है।

Bash For उदाहरण 2. n यादृच्छिक संख्याएं जनरेट करें

$ cat random.sh #! /bin/bash echo -e "How many random numbers you want to generate" read max for (( start = 1; start <= $max; start++ )) do echo -e $RANDOM done $ ./random.sh How many random numbers you want to generate 5 6119 27200 1998 12097 9181

उपरोक्त कोड स्निपेट में, for लूप अधिकतम बार यादृच्छिक संख्या जनरेट करता है। RANDOM एक आंतरिक bash फ़ंक्शन है जो प्रत्येक आह्वान पर एक यादृच्छिक पूर्णांक लौटाता है।

Bash While लूप

शेल प्रोग्रामिंग भाषा द्वारा प्रदान किया गया एक और पुनरावृत्ति स्टेटमेंट while स्टेटमेंट है।

सिंटैक्स: while expression do commands done 

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

  • while, do, done कीवर्ड हैं
  • अभिव्यक्ति कोई भी अभिव्यक्ति है जो एक स्केलर मान लौटाती है
  • While स्टेटमेंट कोड के एक ब्लॉक को तब तक निष्पादित करता है जब तक प्रदान की गई सशर्त अभिव्यक्ति सत्य है।

Bash While उदाहरण 3. फ़ाइल में सामग्री लिखें

निम्नलिखित उदाहरण stdout से डेटा पढ़ता है और फ़ाइल में लिखता है।

$ cat writefile.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to create" read file while read line do echo $line >> $file done $ sh writefile.sh Enter absolute path of the file name you want to create /tmp/a while for until $ cat /tmp/a while for until

उपरोक्त उदाहरण, उपयोगकर्ता से फ़ाइलनाम पढ़ता है, और stdin से डेटा की लाइनें पढ़ता है और प्रत्येक लाइन को दिए गए फ़ाइलनाम में जोड़ता है। जब EOF दर्ज किया जाता है, तो read विफल हो जाएगा, इसलिए लूप वहीं समाप्त होता है।

यदि आप बहुत सारे bash स्क्रिप्ट लिख रहे हैं, तो आप Vim एडिटर का उपयोग Bash IDE के रूप में कर सकते हैं जैसा कि हमने पहले Vim bash-support प्लगइन का उपयोग करके चर्चा की थी।

Bash While उदाहरण 4. फ़ाइल की सामग्री पढ़ें

पिछले उदाहरण में, यह stdout से डेटा पढ़ता है और इसे फ़ाइल में लिखता है। इस उदाहरण में, यह फ़ाइल की सामग्री पढ़ता है और इसे stdout में लिखता है।

$ cat read.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to read" read file exec <$file # stdin को फ़ाइल पर रीडायरेक्ट करता है while read line do echo $line done $ ./read.sh Enter absolute path of the file name you want to read /tmp/a while for until

इस उदाहरण में, यह पढ़ने के लिए फ़ाइलनाम प्राप्त करता है, और exec का उपयोग करके stdin को फ़ाइल पर रीडायरेक्ट करता है। उस बिंदु से, सभी stdin उस फ़ाइल से आते हैं, न कि कीबोर्ड से। read कमांड stdin से लाइन पढ़ता है, इसलिए while लूप stdin को तब तक पढ़ता है जब तक EOF नहीं होता।

Bash Until लूप

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

सिंटैक्स: until expression do commands #लूप का बॉडी done 

उपरोक्त bash until सिंटैक्स में:
जहां until, do, done कीवर्ड हैं
अभिव्यक्ति कोई भी सशर्त अभिव्यक्ति

Bash Until उदाहरण 5. लॉगफ़ाइल मॉनिटर करें

यह उदाहरण लॉगफ़ाइल के आकार की निगरानी करता है, एक बार लॉगफ़ाइल का आकार 2000 बाइट्स तक पहुंच जाता है, यह उस लॉगफ़ाइल की एक कॉपी लेता है।

$ cat monitor.sh file=/tmp/logfile until [ $(ls -l $file | awk '{print $5}') -gt 2000 ] do echo "Sleeping for next 5 seconds" sleep 5 done date=`date +%s` cp $file "$file-"$date.bak $ ./monitor.sh Sleeping for next 5 seconds Sleeping for next 5 seconds $ ls -l /tmp/logfile* -rw-r--r-- 1 sss sss 2010 Jun 24 12:29 logfile -rw-r--r-- 1 sss sss 2005 Jun 24 16:09 logfile-1277474574.bak

Until स्टेटमेंट लूप के बॉडी को तब तक निष्पादित करता रहता है जब तक शर्त सत्य नहीं हो जाती। इस उदाहरण में शर्त फ़ाइल का आकार 2000 बाइट्स से अधिक है, इसलिए यह फ़ाइल को कॉपी करता है एक बार यह 2000 बाइट्स तक पहुंच जाता है।

इसके अलावा, हमारे पहले के Bash सरणी उदाहरण देखना सुनिश्चित करें।

Bash Until उदाहरण 6. मशीन के चालू होने की प्रतीक्षा करें

यह उदाहरण उस मशीन के चालू होने की प्रतीक्षा करने के लिए उपयोग किया जाता है इससे पहले कि उस मशीन पर ssh किया जाए। Until लूप स्टेटमेंट केवल तभी समाप्त होता है जब ping प्रतिक्रिया देता है।

$ cat mac_wait.sh #! /bin/bash read -p "Enter IP Address:" ipadd echo $ipadd until ping -c 1 $ipadd do sleep 60; done ssh $ipadd $./mac_wait.sh Enter IP Address:192.143.2.10 PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. --- 192.143.2.10 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. 64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms --- 192.143.2.10 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established. Are you sure you want to continue connecting (yes/no)? yes

Until लूप कमांड लाइन पर काफी उपयोगी है, कुछ घटनाओं के घटित होने की प्रतीक्षा करने के तरीके के रूप में।

  1. आपके लिए 6 सर्वश्रेष्ठ स्टेटिक वेबसाइट CMS आपके लिए 6 सर्वश्रेष्ठ स्टेटिक वेबसाइट CMS

    स्टेटिक साइट जेनरेटर (SSG) कुछ प्रकार की वेबसाइटों के लिए डेवलपर्स के बीच लोकप्रियता में बढ़े हैं। Jekyll, Hugo, Hexo, और अन्य जैसे टूल्स ने सर्वर-साइड निर्भरताओं के बारे में चिंता किए बिना वेबसाइट स्थापित करना आसान बना दिया है। सही स्टेटिक वेबसाइट CMS होने से आपकी साइट की सामग्री का प्रबंधन भी आसान

  1. Bash में फ़ाइल पढ़ने में मास्टरी: सर्वश्रेष्ठ While-लूप तकनीकें Bash में फ़ाइल पढ़ने में मास्टरी: सर्वश्रेष्ठ While-लूप तकनीकें

    यह लेख bash स्क्रिप्ट में while लूप का उपयोग करके फ़ाइलें पढ़ने के बारे में है। फ़ाइल पढ़ना प्रोग्रामिंग में एक सामान्य ऑपरेशन है। आपको विभिन्न तरीकों से परिचित होना चाहिए और कौन सी विधि उपयोग करने के लिए अधिक कुशल है। Bash में, एक ही कार्य को कई तरीकों से प्राप्त किया जा सकता है लेकिन कार्य पूरा कर

  1. 3 आकर्षक कमांड-लाइन गेम्स के साथ बैश को तेज़ी से सीखें 3 आकर्षक कमांड-लाइन गेम्स के साथ बैश को तेज़ी से सीखें

    सीखना कठिन काम है, और किसी को काम पसंद नहीं है। इसका मतलब है कि चाहे बैश सीखना कितना भी आसान हो, फिर भी यह आपको काम जैसा लग सकता है। जब तक, निश्चित रूप से, आप गेमिंग के माध्यम से सीखते हैं। आप नहीं सोचेंगे कि बैश टर्मिनल का उपयोग करना सिखाने के लिए कई गेम्स होंगे, और आप सही होंगे। गंभीर PC गेमर्स जा