Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

आपको लूप में रखते हुए - बैश फॉर, जबकि, लूप के उदाहरणों तक

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

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

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

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

  1. लूप के लिए
  2. लूप के दौरान
  3. लूप तक

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

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

बैश फॉर लूप - पहला तरीका

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

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

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


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

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

  1. लूप के दौरान बैश स्क्रिप्ट में फ़ाइल पढ़ने के विभिन्न तरीके

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

  1. मजेदार तरीके से बैश सीखने के लिए 3 कमांड लाइन गेम

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