शुरुआती गाइड बाश - शर्तें और चर

परिचय

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

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

आप पहले दो गाइड देखकर देख सकते हैं:

यदि आप बाश स्क्रिप्टिंग के लिए नए हैं तो मैं इस के साथ जारी रखने से पहले पहले दो गाइड पढ़ने की सलाह देता हूं।

इस मार्गदर्शिका में मैं हाइलाइट कर रहा हूं कि उपयोगकर्ता इनपुट का परीक्षण करने के लिए सशर्त बयानों का उपयोग कैसे करें और यह नियंत्रित करने के लिए कि स्क्रिप्ट कैसे कार्य करती है।

Rsstail स्थापित करें

इस मार्गदर्शिका का पालन करने के लिए आपको आरएसटी फ़ीड नामक एक कमांड लाइन एप्लिकेशन इंस्टॉल करना होगा जिसका उपयोग आरएसएस फ़ीड पढ़ने के लिए किया जाता है।

यदि आप डेबियन / उबंटू / मिंट आधारित वितरण प्रकार का उपयोग कर रहे हैं तो निम्न प्रकार:

sudo apt-rsstail स्थापित करें

Fedora / CentOS आदि के लिए निम्न टाइप करें:

yum इंस्टॉल rsstail

OpenSUSE के लिए निम्न टाइप करें:

zypper rsstail स्थापित करें

आईएफ कथन

टर्मिनल खोलें और निम्नलिखित टाइप करके rssget.sh नामक फ़ाइल बनाएं:

सुडो नैनो rssget.sh

नैनो संपादक के भीतर निम्न पाठ दर्ज करें:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

CTRL और O दबाकर फ़ाइल को सहेजें और फिर CTRL और X दबाकर बाहर निकलें।

निम्न टाइप करके स्क्रिप्ट चलाएं:

sh rssget.sh

लिपि linux.about.com आरएसएस फ़ीड से खिताब की एक सूची वापस कर देगा।

यह एक अत्यधिक उपयोगी लिपि नहीं है क्योंकि यह सिर्फ एक आरएसएस फ़ीड से खिताब पुनः प्राप्त करता है लेकिन यह Linux.about.com आरएसएस फ़ीड के पथ को याद रखने के लिए बचाता है।

फिर से नैनो में rssget.sh स्क्रिप्ट खोलें और निम्नानुसार देखने के लिए फ़ाइल को संपादित करें:

#! / bin / bash

अगर [$ 1 = "verbose"]
फिर
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
फाई

निम्नलिखित टाइप करके स्क्रिप्ट को फिर से चलाएं:

sh rssget.sh verbose

इस बार आरएसएस फ़ीड शीर्षक, लिंक और विवरण के साथ वापस आता है।

आइए स्क्रिप्ट का थोड़ा विस्तार से विश्लेषण करें:

हमारे द्वारा लिखे गए प्रत्येक स्क्रिप्ट में #! / Bin / bash प्रकट होता है। अगली पंक्ति मूल रूप से उपयोगकर्ता द्वारा प्रदान किए गए पहले इनपुट पैरामीटर को देखती है और इसे "वर्बोज़" शब्द से तुलना करती है। यदि इनपुट पैरामीटर और शब्द "वर्बोज़" शब्द मिलान करता है तो फाई के बीच की रेखाएं चलती हैं।

उपर्युक्त लिपि स्पष्ट रूप से त्रुटिपूर्ण है। क्या होता है यदि आप इनपुट पैरामीटर प्रदान नहीं करते हैं? जवाब यह है कि आपको अप्रत्याशित ऑपरेटर की लाइनों में एक त्रुटि मिलती है।

दूसरी बड़ी खामियां यह है कि यदि आप "वर्बोज़" शब्द नहीं देते हैं तो कुछ भी नहीं होता है। आदर्श रूप से यदि आप शब्द वर्बोज़ प्रदान नहीं करते हैं तो स्क्रिप्ट शीर्षक की सूची लौटाएगी।

Rssget.sh फ़ाइल को संपादित करने के लिए फिर से नैनो का उपयोग करें और कोड को निम्नानुसार संशोधित करें:

#! / bin / bash

अगर [$ 1 = "verbose"]
फिर
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई

फ़ाइल को सहेजें और इसे टाइप करके इसे चलाएं:

sh rssget.sh verbose

शीर्षक, विवरण और लिंक की एक सूची दिखाई देगी। अब इसे फिर से चलाएं:

sh rssget.sh खिताब

इस बार सिर्फ शीर्षक की एक सूची दिखाई देती है।

स्क्रिप्ट का अतिरिक्त भाग लाइन 4 पर है और अन्य कथन प्रस्तुत करता है । असल में स्क्रिप्ट अब कहती है कि अगर पहला पैरामीटर "वर्बोज़" शब्द आरएसएस फ़ीड के लिए वर्णन, लिंक और शीर्षक प्राप्त करता है, लेकिन यदि पहला पैरामीटर कुछ और है तो बस शीर्षकों की एक सूची प्राप्त करें।

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

इन मुद्दों को आजमाएं और साफ़ करने से पहले मैं आपको एक और कमांड दिखाना चाहता हूं जो आईएफ स्टेटमेंट के साथ जाता है।

निम्नानुसार देखने के लिए अपनी rssget.sh स्क्रिप्ट संपादित करें:

#! / bin / bash

अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई

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

अब स्क्रिप्ट निम्नानुसार काम करता है। यदि आप sh rssget.sh चलाते हैं तो आपको विवरण, लिंक और शीर्षक मिलते हैं। यदि इसके बजाय आप sh rssget.sh विवरण चलाते हैं तो आपको केवल शीर्षक और विवरण मिलेंगे। यदि आप किसी अन्य शब्द की आपूर्ति करते हैं तो आपको शीर्षकों की एक सूची मिल जाएगी।

यह सशर्त बयान की सूची के साथ जल्दी से आने का एक तरीका पेश करता है। ईएलआईएफ करने का एक वैकल्पिक तरीका है जिसे नेस्टेड आईएफ कथन के रूप में जाना जाता है।

निम्नलिखित उदाहरण है कि नेस्टेड IF कथन कैसे काम करते हैं:

#! / bin / bash

अगर [$ 2 = "aboutdotcom"]
फिर
अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई
अन्य
अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई
फाई

अगर आप इसे पसंद करते हैं या कॉपी करते हैं और इसे अपनी rssget.sh फ़ाइल में पेस्ट करते हैं तो उसे टाइप करने के लिए स्वतंत्र महसूस करें।

उपर्युक्त स्क्रिप्ट एक दूसरा पैरामीटर पेश करती है जो आपको आरएसएस फ़ीड में "about.com" या "lxer.com" चुनने देती है।

इसे चलाने के लिए आप निम्न में टाइप करें:

sh rssget.sh सभी aboutdotcom

या

sh rssget.sh सभी lxer

आप निश्चित रूप से वर्णन या शीर्षक प्रदान करने के लिए विवरण या शीर्षक के साथ सभी को प्रतिस्थापित कर सकते हैं।

असल में उपर्युक्त कोड कहता है कि यदि दूसरा पैरामीटर aboutdotcom है तो दूसरा कथन देखें जो पिछले स्क्रिप्ट से वही है, यदि दूसरा पैरामीटर lxer है तो शीर्षक का विवरण देने के लिए फिर से स्टेटमेंट को देखें, विवरण या सब कुछ।

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

कल्पना कीजिए कि आप एक और आरएसएस फ़ीड जैसे हर रोज लिनक्स उपयोगकर्ता या लिनक्स टुडे को जोड़ना चाहते हैं? लिपि बड़ी हो जाएगी और यदि आपने फैसला किया कि आप आंतरिक IF कथन को बदलना चाहते हैं तो आपको इसे कई स्थानों में बदलना होगा।

जबकि एक घोंसले के लिए एक समय और जगह है अगर उन्हें कम से कम इस्तेमाल किया जाना चाहिए। आमतौर पर आपके कोड को दोबारा करने का एक तरीका है ताकि आपको घोंसला वाले आईएफ की आवश्यकता न हो। मैं इस विषय पर भविष्य के लेख में आऊंगा।

आइए अब डफ पैरामीटर में प्रवेश करने वाले लोगों के मुद्दे को ठीक करने पर विचार करें। उदाहरण के लिए ऊपर दिए गए स्क्रिप्ट में यदि उपयोगकर्ता दूसरे पैरामीटर के रूप में "aboutdotcom" के अलावा कुछ अन्य में प्रवेश करता है तो लेखों की एक सूची एलएक्सईआर से आरएसएस फ़ीड से दिखाई देती है, भले ही उपयोगकर्ता lxer दर्ज करें या नहीं।

इसके अतिरिक्त यदि उपयोगकर्ता पहले पैरामीटर के रूप में "सभी" या "विवरण" दर्ज नहीं करता है तो डिफ़ॉल्ट शीर्षक की एक सूची है जो उपयोगकर्ता के इरादे से हो सकती है या नहीं।

निम्न स्क्रिप्ट को देखें (या इसे अपनी rssget.sh फ़ाइल में कॉपी और पेस्ट करें।

#! / bin / bash

अगर [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
फिर
अगर [$ 1 = "सब"] || [$ 1 = "विवरण"] || [$ 1 = "शीर्षक"]
फिर
अगर [$ 2 = "aboutdotcom"]
फिर

अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई
अन्य
अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई
फाई
फाई
फाई

ध्यान देने वाली पहली बात यह है कि स्क्रिप्ट अब काफी बड़ी हो रही है और आप तुरंत देख सकते हैं कि कस्ट्रोल नेस्टेड अगर कथन कैसे बन सकता है।

इस स्क्रिप्ट में जो महत्वपूर्ण है वह आईएफ स्टेटमेंट है लाइन 2 और लाइन 4 पर उस अनुभाग को कथन दें।

|| या तो खड़ा है। तो लाइन अगर [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] जांचता है कि दूसरा पैरामीटर "aboutdotcom" या "lxer" के बराबर है या नहीं। यदि ऐसा नहीं है तो आईएफ कथन पूरा हो गया है क्योंकि बाहरी सबसे अधिक IF के लिए कोई और कथन नहीं है

इसी तरह लाइन 4 लाइन पर [$ 1 = "सब"] || [$ 1 = "विवरण"] || [$ 1 = "शीर्षक"] जांचता है कि पहला पैरामीटर या तो "सभी" या "विवरण" या "शीर्षक" के बराबर है या नहीं।

अब यदि उपयोगकर्ता sh rssget.sh आलू पनीर चलाता है तो कुछ भी वापस नहीं किया जाता है, जबकि उन्हें एलएक्सईआर से खिताब की सूची प्राप्त होती।

के विपरीत || है &&। & & ऑपरेटर के लिए खड़ा है और।

मैं स्क्रिप्ट को एक दुःस्वप्न की तरह दिखने जा रहा हूं लेकिन यह सुनिश्चित करने के लिए सभी महत्वपूर्ण जांच करता है कि उपयोगकर्ता ने 2 पैरामीटर प्रदान किए हैं।

#! / bin / bash

अगर [$ # -eq 2]
फिर

अगर [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
फिर
अगर [$ 1 = "सब"] || [$ 1 = "विवरण"] || [$ 1 = "शीर्षक"]
फिर
अगर [$ 2 = "aboutdotcom"]
फिर

अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई
अन्य
अगर [$ 1 = "सब"]
फिर
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "विवरण"]
फिर
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
अन्य
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
फाई
फाई
फाई
फाई
फाई

उस स्क्रिप्ट में अतिरिक्त एकमात्र बिट निम्न प्रकार का बाहरी IF कथन है: यदि [$ # -eq 2] । यदि आप इनपुट पैरामीटर के बारे में आलेख पढ़ते हैं तो आपको पता चलेगा कि $ # इनपुट पैरामीटर की संख्या की गिनती देता है। -ईक बराबर के लिए खड़ा है। इसलिए आईएफ स्टेटमेंट जांचता है कि उपयोगकर्ता ने 2 पैरामीटर दर्ज किए हैं और यदि वे कुछ भी किए बिना बाहर निकलते हैं। (विशेष रूप से अनुकूल नहीं)।

मुझे पता है कि यह ट्यूटोरियल काफी बड़ा हो रहा है। इस हफ्ते को कवर करने के लिए और कुछ नहीं है, लेकिन हम खत्म होने से पहले स्क्रिप्ट को साफ करने में मदद करना चाहते हैं।

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

#! / bin / bash


अगर [$ # -eq 2]
फिर
मामले $ 2 में
aboutdotcom)
मामले में $ 1
सब)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
विवरण)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
शीर्षक)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
मामले में $ 1
सब)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
विवरण)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
शीर्षक)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
फाई

मामला कथन अगर ईएलएसई अगर ईएलएसई अगर ईएफएसई लिखने का एक अच्छा तरीका है IF।

उदाहरण के लिए यह तर्क

अगर फल = केला
फिर यह
ईएलएसई अगर फल = संतरे
फिर यह
ईएलएसई अगर फल = अंगूर
फिर यह
अगर अंत

के रूप में फिर से लिखा जा सकता है:

मामले में फल
केले)
यह करो
;;
संतरे)
यह करो
;;
अंगूर)
यह करो
;;
esac

असल में मामले के बाद पहली वस्तु वह चीज़ है जिसे आप तुलना करने जा रहे हैं (यानी फल)। फिर ब्रैकेट से पहले प्रत्येक आइटम वह चीज है जिसके साथ आप तुलना कर रहे हैं और यदि यह पहले की रेखाओं से मेल खाता है; भाग जाएगा एक केस स्टेटमेंट रिवर्स एएसएसी (जो पीछे की ओर है) के साथ समाप्त हो जाता है।

Rssget.sh स्क्रिप्ट में केस स्टेटमेंट उस भयानक घोंसले को हटा देता है हालांकि वास्तव में इसे पर्याप्त रूप से सुधार नहीं करता है।

वास्तव में स्क्रिप्ट को बेहतर बनाने के लिए मुझे आपको चर के साथ पेश करने की आवश्यकता है।

निम्नलिखित कोड को देखें:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
प्रदर्शन = ""
यूआरएल = ""

अगर [$ # -एलटी 2] || [$ # -gt 2]
फिर
गूंज "उपयोग: rssget.sh [सभी | विवरण | शीर्षक] [aboutdotcom | lxer]";
बाहर जाएं;
फाई

मामले में $ 1
सब)
प्रदर्शन = "- डी-एल-यू"
;;
विवरण)
प्रदर्शन = "- डी-यू"
;;
शीर्षक)
प्रदर्शन = "- यू"
;;
esac

मामले $ 2 में
aboutdotcom)
यूआरएल = $ aboutdotcom;
;;
lxer)
यूआरएल = $ lxer;
;;
esac
$ rsstail $ यूआरएल प्रदर्शित;

एक चर को इसे एक नाम देकर परिभाषित किया जाता है और फिर इसे मान दिया जाता है। उपरोक्त उदाहरण में निम्नलिखित वैरिएबल असाइनमेंट हैं:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
प्रदर्शन = ""
यूआरएल = ""

चर का उपयोग करके स्क्रिप्ट तुरंत अधिक प्रबंधनीय है। उदाहरण के लिए प्रत्येक पैरामीटर को अलग से संभाला जाता है और इसलिए कोई नेस्टेड IF कथन नहीं होता है।

डिस्प्ले वैरिएबल अब इस पर निर्भर करता है कि आपने सभी, विवरण या शीर्षक चुना है या यूआरएल वैरिएबल aboutdotcom चर के मान पर सेट किया गया है या lxer चर के मान पर निर्भर करता है कि आपने डॉट कॉम या एलएक्सर चुना है या नहीं।

Rsstail कमांड को अभी सही तरीके से चलाने के लिए डिस्प्ले और यूआरएल के मूल्य का उपयोग करना होगा।

जबकि चर उन्हें केवल एक नाम देकर सेट कर रहे हैं, वास्तव में उनका उपयोग करने के लिए आपको उनके सामने एक $ चिह्न रखना होगा। दूसरे शब्दों में वैरिएबल = वैल्यू वैरिएबल को वैल्यू पर सेट करता है जबकि $ वैरिएबल का मतलब है वैरिएबल की सामग्री दें।

इस ट्यूटोरियल के लिए अंतिम स्क्रिप्ट निम्नलिखित है।

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
उपयोग = "उपयोग: rssget.sh [सभी | विवरण | शीर्षक] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
प्रदर्शन = ""
यूआरएल = ""

अगर [$ # -एलटी 2] || [$ # -gt 2]
फिर
$ उपयोग गूंज;
बाहर जाएं;
फाई

मामले में $ 1
सब)
प्रदर्शन = "- डी-एल-यू"
;;
विवरण)
प्रदर्शन = "- डी-यू"
;;
शीर्षक)
प्रदर्शन = "- यू"
;;
*)
$ उपयोग गूंज;
बाहर जाएं;
;;
esac

मामले $ 2 में
aboutdotcom)
यूआरएल = $ aboutdotcom;
;;
lxer)
यूआरएल = $ lxer;
;;
linuxtoday)
यूआरएल = $ linuxtoday;
;;
everydaylinuxuser)
यूआरएल = $ everydaylinuxuser;
;;
*)
$ उपयोग गूंज;
बाहर जाएं;
esac

$ rsstail $ यूआरएल प्रदर्शित;

उपर्युक्त स्क्रिप्ट अधिक आरएसएस फ़ीड प्रस्तुत करती है और एक उपयोग चर है जो उपयोगकर्ता को स्क्रिप्ट का उपयोग करने का तरीका बताता है यदि वे या तो 2 चर दर्ज नहीं करते हैं या वे चर के लिए गलत विकल्प दर्ज करते हैं।

सारांश

यह एक महाकाव्य लेख रहा है और शायद बहुत जल्द हो गया हो सकता है। अगली मार्गदर्शिका में मैं आपको आईएफ स्टेटमेंट के लिए सभी तुलना विकल्प दिखाऊंगा और चर के संबंध में बात करने के लिए अभी भी बहुत कुछ है।

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

दोहरी बूटिंग विंडोज और उबंटू से अधिक उपयोगी मार्गदर्शिकाएं जानने के लिए l inux.about.com के अनुभागों को कैसे करें (लेखों की सूची देखने के लिए श्रेणियों के पीछे स्क्रॉल करें) देखें, जो कि GNOME बॉक्स का उपयोग करके वर्चुअल मशीन सेट अप करने के लिए है।