लूपिंग स्टेटमेंट का इस्तेमाल प्रोग्राम को बार-बार किसी स्टेटमेंट को निष्पादित करने के लिए मजबूर करने के लिए किया जाता है। निष्पादित कथन को लूप बॉडी कहा जाता है।
लूप्स तब तक क्रियान्वित होते हैं जब तक कि एक कंट्रोलिंग एक्सप्रेशन का मान 0 न हो। कंट्रोलिंग एक्सप्रेशन कोई भी स्केलर डेटा प्रकार हो सकता है।
शेल भाषा कई पुनरावृत्ति या लूपिंग स्टेटमेंट भी प्रदान करती है। इस लेख में आइए हम उन लूपिंग स्टेटमेंट्स की समीक्षा करें जो बैश कुछ उदाहरणों का उपयोग करके प्रदान करता है।
बैश निम्नलिखित तीन प्रकार के लूपिंग स्टेटमेंट का समर्थन करता है
- लूप के लिए
- लूप के दौरान
- लूप तक
यह लेख चल रहे बैश ट्यूटोरियल श्रृंखला का हिस्सा है।
लूप नेस्टेड किया जा सकता है। किसी भी अन्य प्रोग्रामिंग भाषा की तरह, बैश भी वर्तमान लूप से बाहर निकलने के लिए ब्रेक स्टेटमेंट का समर्थन करता है, और लूप स्टेटमेंट के अगले पुनरावृत्ति को फिर से शुरू करने के लिए स्टेटमेंट जारी रखता है।
बैश फॉर लूप - पहला तरीका
लूप के लिए आमतौर पर तब उपयोग किया जाता है जब बैश लूप में प्रवेश करने से पहले पुनरावृत्तियों की संख्या ज्ञात हो। बैश दो प्रकार के लूप का समर्थन करता है। लूप के लिए बैश का पहला रूप है:
for varname in list do commands ##Body of the loop done
उपरोक्त सिंटैक्स में:
<केंद्र> केंद्र>- फॉर, इन, डू एंड डन कीवर्ड हैं
- सूची कोई भी सूची है जिसमें वस्तुओं की सूची है
- varname कोई भी बैश वैरिएबल नाम है।
इस फॉर्म में, स्टेटमेंट के लिए सूची में प्रत्येक आइटम के लिए एक बार बॉडी में संलग्न कमांड को निष्पादित करता है। सूची से वर्तमान आइटम लूप के माध्यम से हर बार एक चर "varname" में संग्रहीत किया जाएगा। इस वर्नाम को लूप के शरीर में संसाधित किया जा सकता है। यह सूची एक चर हो सकती है जिसमें रिक्त स्थान द्वारा अलग किए गए कई शब्द शामिल हैं। यदि कथन के लिए सूची गायब है, तो यह स्थितिगत पैरामीटर लेता है जिसे शेल में पारित किया गया था।
बैश फॉर लूप उदाहरण 1. सभी ज़िप फ़ाइल को अनज़िप करें
निम्न उदाहरण फाइलों की सूची ढूंढता है जो रूट निर्देशिका में "*.zip*" से मेल खाता है, और उसी स्थान पर एक नई निर्देशिका बनाता है जहां ज़िप फ़ाइल मौजूद है, और ज़िप फ़ाइल सामग्री को अनज़िप करें।
# cat zip_unzip.sh
#! /bin/bash
# Find files which has .zip
for file in `find /root -name "*.zip*" -type f`
do
# Skip the extension .zip
dirname=`echo ${file} | awk -F'.' '{print $1}'`
# Create the directory
mkdir $dirname
# Copy the zip file
cp ${file} ${dirname}
cd $dirname
# Unzip the zip file from newly created directory
unzip ${dirname}/$(echo ${file##/*/})
done - इस उदाहरण में कमांड फाइलों की सूची लौटाता है, जिसमें से प्रत्येक फाइल को एक लूप के माध्यम से संसाधित किया जाएगा।
- प्रत्येक आइटम के लिए, यह ज़िप फ़ाइल के नाम के साथ निर्देशिका बनाता है, और ज़िप फ़ाइल को नई बनाई गई निर्देशिका में कॉपी करता है और वहां से ज़िप फ़ाइल को अनज़िप करता है।
- इको स्टेटमेंट, इको ${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
बैश लूप के समान, Awk भी लूप और लूप के लिए प्रदान करता है जैसा कि हमने अपने Awk while and For Loop लेख में चर्चा की थी।
लूप के लिए बैश - दूसरी विधि
लूप के लिए दूसरा रूप 'सी' प्रोग्रामिंग भाषा में लूप के समान है, जिसमें तीन अभिव्यक्ति (आरंभीकरण, स्थिति और अद्यतन) हैं।
for (( expr1; expr2; expr3 ))
do
commands
done - कमांड सिंटैक्स के लिए उपरोक्त बैश में, पहले पुनरावृत्ति से पहले, expr1 का मूल्यांकन किया जाता है। यह आमतौर पर लूप के लिए वेरिएबल को इनिशियलाइज़ करने के लिए उपयोग किया जाता है।
- करने और किए के बीच सभी कथनों को बार-बार निष्पादित किया जाता है जब तक कि expr2 का मान TRUE न हो।
- लूप के प्रत्येक पुनरावृत्ति के बाद, expr3 का मूल्यांकन किया जाता है। यह आमतौर पर लूप काउंटर को बढ़ाने के लिए उपयोग किया जाता है।
निम्न उदाहरण यादृच्छिक संख्याओं की n संख्या उत्पन्न करता है।
बैश उदाहरण 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 उपरोक्त कोड स्निपेट में, लूप के लिए अधिकतम संख्या में यादृच्छिक संख्या उत्पन्न करता है। रैंडम एक आंतरिक बैश फ़ंक्शन है जो प्रत्येक आमंत्रण पर एक यादृच्छिक पूर्णांक देता है।
लूप करते समय बैश करें
शेल प्रोग्रामिंग भाषा द्वारा पेश किया गया एक अन्य पुनरावृति कथन जबकि कथन है।
Syntax: while expression do commands done
उपरोक्त में जबकि लूप सिंटैक्स:
- जबकि, करो, हो चुके कीवर्ड हैं
- व्यंजक कोई भी व्यंजक है जो एक अदिश मान देता है
- जबकि स्टेटमेंट के कारण कोड का एक ब्लॉक निष्पादित होता है जबकि एक प्रदत्त सशर्त अभिव्यक्ति सत्य होती है।
उदाहरण के लिए बैश करें 3. किसी फ़ाइल में सामग्री लिखें
निम्न उदाहरण स्टडआउट से डेटा पढ़ता है और एक फ़ाइल में लिखता है।
$ 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 में प्रवेश होता है, तो पढ़ना विफल हो जाएगा, इसलिए लूप वहीं समाप्त हो जाता है।
यदि आप बहुत सारी बैश स्क्रिप्ट लिख रहे हैं, तो आप विम संपादक का उपयोग बैश आईडीई के रूप में विम बैश-समर्थन प्लगइन का उपयोग करके कर सकते हैं जैसा कि हमने पहले चर्चा की थी।
बैश जबकि उदाहरण 4. फ़ाइल की सामग्री पढ़ें
पिछले उदाहरण में, यह stdout से डेटा पढ़ता है और इसे एक फ़ाइल में लिखता है। इस उदाहरण में, यह फ़ाइल को पढ़ता है
सामग्री और इसे एक स्टडआउट में लिखता है।
$ cat read.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to read" read file exec <$file # redirects stdin to a file 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
इस उदाहरण में, इसे पढ़ने के लिए फ़ाइल नाम मिलता है, और निष्पादन का उपयोग करके यह एक फ़ाइल में स्टड को पुनर्निर्देशित करता है। उस बिंदु से, सभी स्टड उस फ़ाइल से आते हैं, न कि कीबोर्ड से। रीड कमांड स्टड से लाइन को पढ़ता है, इसलिए जब तक लूप स्टड को पढ़ता है, तब तक ईओएफ होता है।
लूप तक बैश करें
जब तक कथन वाक्य रचना में बहुत समान है और थोड़ी देर के कथन के लिए कार्य करता है। दोनों के बीच एकमात्र वास्तविक अंतर यह है कि जब तक स्टेटमेंट अपने कोड ब्लॉक को निष्पादित करता है, जबकि इसकी सशर्त अभिव्यक्ति झूठी होती है, और जबकि स्टेटमेंट इसके कोड ब्लॉक को निष्पादित करता है, जबकि इसकी सशर्त अभिव्यक्ति सत्य होती है।
syntax: until expression do commands #body of the loop done
उपरोक्त बैश में सिंटैक्स तक:
जहां तक, करें, किया गया कीवर्ड हैं
किसी भी सशर्त अभिव्यक्ति की अभिव्यक्ति
उदाहरण 5 तक बैश करें। लॉगफाइल की निगरानी करें
यह उदाहरण लॉगफाइल के आकार की निगरानी करता है, एक बार लॉगफाइल का आकार 2000bytes तक पहुंचने के बाद, यह उस लॉगफाइल की प्रतिलिपि लेता है।
$ 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 जब तक स्थिति सही नहीं हो जाती, तब तक स्टेटमेंट लूप के शरीर को निष्पादित करना जारी रखता है। इस उदाहरण में स्थिति 2000 बाइट्स से अधिक फ़ाइल का आकार है, इसलिए यह 2000 बाइट्स तक पहुंचने के बाद फ़ाइल की प्रतिलिपि बनाता है।
इसके अलावा, हमारे पहले के बैश ऐरे उदाहरणों को देखना सुनिश्चित करें।
उदाहरण 6 तक बैश करें। मशीन के आने की प्रतीक्षा कर रहा है
इस उदाहरण का उपयोग उस मशीन पर ssh करने से पहले मशीन के आने तक प्रतीक्षा करने के लिए किया जाता है। जब तक लूप स्टेटमेंट केवल तभी समाप्त होता है जब पिंग प्रतिक्रिया देता है।
$ 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 कुछ घटनाओं के होने की प्रतीक्षा करने के तरीके के रूप में, कमांड लाइन पर लूप काफी उपयोगी होता है।