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

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

12 आपके Linux शेल स्क्रिप्टिंग के लिए लूप उदाहरण के लिए बैशलूप के लिए दो प्रकार के बैश उपलब्ध हैं। एक मूल्यों की सूची के साथ "इन" कीवर्ड का उपयोग कर रहा है, दूसरा सी प्रोग्रामिंग जैसे सिंटैक्स का उपयोग कर रहा है।

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

यह लूप के तरीकों के लिए दोनों बैश की व्याख्या करता है, और आपकी शेल स्क्रिप्ट में लूप के लिए बैश का उपयोग करने के तरीके पर 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: अपने भविष्य के संदर्भ के लिए इस लेख को बुकमार्क करना न भूलें।


  1. विंडोज 10 [ट्यूटोरियल] पर बैश (लिनक्स शेल) को कैसे स्थापित और उपयोग करें

    यहां बताया गया है कि विंडोज़ पर लिनक्स शेल को कैसे सेट अप करें और उसका उपयोग कैसे करें - लिनक्स के लिए विंडोज सबसिस्टम का उपयोग करके (WSL )। यह ट्यूटोरियल 2020 से विंडोज 10 के अप-टू-डेट वर्जन के लिए है। मैं विंडोज 10 के पुराने संस्करणों या विंडोज 8/7/XP/3.1 के अन्य तरीकों पर WSL का उपयोग करने के त

  1. बैश शेल PS1:एंजेलिना जोली की तरह अपने लिनक्स को शीघ्र बनाने के लिए 10 उदाहरण

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

  1. बैश स्क्रिप्टिंग परिचय ट्यूटोरियल 5 व्यावहारिक उदाहरणों के साथ

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