शेल स्क्रिप्ट बनाना सबसे आवश्यक कौशल में से एक है जो लिनक्स उपयोगकर्ताओं की उंगलियों पर होना चाहिए। शेल स्क्रिप्ट दोहराए जाने वाले कार्यों को स्वचालित करने में एक बड़ी भूमिका निभाती है जो अन्यथा लाइन दर लाइन निष्पादित करना थकाऊ होगा।
इस ट्यूटोरियल में, हम कुछ बुनियादी शेल स्क्रिप्टिंग ऑपरेशंस को हाइलाइट करते हैं जो हर लिनक्स उपयोगकर्ता के पास होने चाहिए।
1. एक साधारण शेल स्क्रिप्ट बनाएं
एक शेल स्क्रिप्ट एक फ़ाइल है जिसमें ASCII टेक्स्ट होता है। हम एक साधारण शेल स्क्रिप्ट बनाकर शुरू करेंगे, और ऐसा करने के लिए, हम एक टेक्स्ट एडिटर का उपयोग करेंगे। काफी संख्या में टेक्स्ट एडिटर हैं, कमांड-लाइन और GUI-आधारित दोनों। इस गाइड के लिए, हम vim एडिटर का उपयोग करेंगे।
हम एक साधारण स्क्रिप्ट बनाकर शुरू करेंगे जो निष्पादित होने पर "Hello world" प्रदर्शित करती है।
$ vim hello.sh
फ़ाइल में निम्नलिखित सामग्री पेस्ट करें और सेव करें।
#!/bin/bash # Print Hello world message echo "Hello World!"
आइए शेल स्क्रिप्ट को लाइन दर लाइन देखें।
- पहली लाइन -
#!/bin/bash- को shebang हेडर के रूप में जाना जाता है। यह एक विशेष निर्माण है जो इंगित करता है कि स्क्रिप्ट की व्याख्या करने के लिए किस प्रोग्राम का उपयोग किया जाएगा। इस मामले में, यह bash शेल होगा जिसे /bin/bash द्वारा इंगित किया गया है। अन्य स्क्रिप्टिंग भाषाएं हैं जैसे Python जिसे#!/usr/bin/python3द्वारा दर्शाया गया है और Perl जिसका shebang हेडर#!/usr/bin/perlद्वारा दर्शाया गया है। - दूसरी लाइन एक कमेंट है। एक कमेंट एक स्टेटमेंट है जो वर्णन करता है कि शेल स्क्रिप्ट क्या करती है और जब स्क्रिप्ट चलाई जाती है तो निष्पादित नहीं होती। कमेंट हमेशा हैश साइन
#से पहले होते हैं। - आखिरी लाइन वह कमांड है जो टर्मिनल पर 'Hello World' संदेश प्रिंट करती है।
अगला कदम chmod कमांड का उपयोग करके एक्जीक्यूट परमिशन असाइन करके स्क्रिप्ट को एक्जीक्यूटेबल बनाना है जैसा कि दिखाया गया है।
$ chmod +x hello.sh
अंत में, निम्न में से किसी भी कमांड का उपयोग करके शेल स्क्रिप्ट चलाएं:
$ bash hello.sh OR $ ./hello.sh
2. कोड निष्पादित करने के लिए कंडीशनल स्टेटमेंट्स का उपयोग करना
अन्य प्रोग्रामिंग भाषाओं की तरह, कंडीशनल स्टेटमेंट्स का उपयोग bash स्क्रिप्टिंग में निर्णय लेने के लिए किया जाता है, केवल सिंटैक्स में मामूली अंतर के साथ। हम if, if-else, और elif कंडीशनल स्टेटमेंट्स को कवर करने जा रहे हैं।
केवल if स्टेटमेंट का उदाहरण
if स्टेटमेंट का उपयोग सिंगल या मल्टीपल कंडीशंस को टेस्ट करने के लिए किया जा सकता है। हम if स्टेटमेंट के मौलिक उपयोग के साथ शुरू करेंगे ताकि सिंगल कंडीशन को टेस्ट किया जा सके। if स्टेटमेंट if ... fi ब्लॉक्स द्वारा परिभाषित किया जाता है।
if command then statement fi
नीचे दिए गए शेल स्क्रिप्ट पर एक नज़र डालें।
#!/bin/bash echo 'Enter the score' read x if [[ $x == 70 ]]; then echo 'Good job!' fi
उपरोक्त शेल स्क्रिप्ट उपयोगकर्ता को एक स्कोर प्रदान करने के लिए प्रेरित करती है जिसे फिर वेरिएबल x में स्टोर किया जाता है। यदि स्कोर 70 से मेल खाता है, तो स्क्रिप्ट आउटपुट "Good job!" लौटाती है। तुलना ऑपरेटर == का उपयोग यह टेस्ट करने के लिए किया जाता है कि वेरिएबल x में स्टोर किया गया दर्ज स्कोर 100 के बराबर है या नहीं।
अन्य तुलना ऑपरेटर्स जिनका आप उपयोग कर सकते हैं उनमें शामिल हैं:
-eq- बराबर-ne- बराबर नहीं-lt- कम-le- कम या बराबर-gt- अधिक-ge- अधिक या बराबर
उदाहरण के लिए, नीचे दिया गया if-statement ब्लॉक 'Work Harder' प्रिंट करता है यदि इनपुट स्कोर 50 से कम कोई मान है।
if [[ $x -lt 50 ]]; then echo 'Work Harder!' fi
if-else स्टेटमेंट का उदाहरण
ऐसी स्थितियों के लिए जहां आपके पास 2 संभावित परिणाम होते हैं: - चाहे यह हो या वह - if-else स्टेटमेंट काम आता है।
if command then statement1 else statement2 fi
नीचे दी गई स्क्रिप्ट इनपुट स्कोर पढ़ती है और जांचती है कि यह 70 से अधिक या बराबर है या नहीं।
यदि स्कोर 70 से अधिक या बराबर है, तो आपको 'Great job, You passed!' संदेश मिलता है। हालांकि, यदि स्कोर 70 से नीचे आता है, तो आउटपुट 'You failed' प्रिंट किया जाएगा।
#!/bin/bash echo 'Enter the score' read x if [[ $x -ge 70 ]]; then echo 'Great job, You passed!' else echo 'You failed' fi
if-elif-else स्टेटमेंट का उदाहरण
ऐसे परिदृश्यों में जहां कई शर्तें और अलग-अलग परिणाम होते हैं, if-elif-else स्टेटमेंट का उपयोग किया जाता है। यह स्टेटमेंट निम्नलिखित फॉर्मेट लेता है।
if condition1 then statement1 elif condition2 then statement2 else statement3 fi
उदाहरण के लिए, हमारे पास एक लॉटरी के लिए एक स्क्रिप्ट है जो जांचती है कि दर्ज नंबर या तो 90, 60 या 30 है।
#!/bin/bash echo 'Enter the score' read x if [[ $x -eq 90 ]]; then echo "You have won the First Prize" elif [[ $x -eq 60 ]]; then echo "You have won the Second Prize" elif [[ $x -eq 30 ]]; then echo "You have won the Second Prize" else echo "Please try again" fi
3. AND लॉजिक के साथ If स्टेटमेंट का उपयोग करना
आप if स्टेटमेंट का उपयोग AND लॉजिक ऑपरेटर के साथ कर सकते हैं ताकि यदि दो शर्तें पूरी होती हैं तो एक कार्य निष्पादित किया जाए। && ऑपरेटर का उपयोग AND लॉजिक को दर्शाने के लिए किया जाता है।
#!/bin/bash echo 'Please Enter your user_id' read user_id echo 'Please Enter your tag_no' read tag_id if [[ ($user_id == "tecmint" && $tag_id -eq 3990) ]]; then echo "Login successful" else echo "Login failure" fi
5. OR लॉजिक के साथ If स्टेटमेंट का उपयोग करना
OR लॉजिक का उपयोग करते समय, जिसे || सिंबल द्वारा दर्शाया जाता है, स्क्रिप्ट को अपेक्षित परिणाम देने के लिए शर्तों में से किसी एक को पूरा करने की आवश्यकता होती है।
#!/bin/bash echo 'Please enter a random number' read number if [[ (number -eq 55 || number -eq 80) ]]; then echo 'Congratulations! You've won' else echo 'Sorry, try again' fi
लूपिंग निर्माणों का उपयोग करें
Bash लूप्स उपयोगकर्ताओं को एक निश्चित परिणाम प्राप्त होने तक कार्यों की एक श्रृंखला करने की अनुमति देते हैं। यह दोहराए जाने वाले कार्यों को करने में काम आता है। इस सेक्शन में, हम कुछ लूप्स पर एक नज़र डालेंगे जिन्हें आप अन्य प्रोग्रामिंग भाषाओं में भी पाएंगे।
While लूप
यह काम करने के लिए सबसे आसान लूप्स में से एक है। सिंटैक्स काफी सरल है:
whiledo commands done
नीचे दिया गया while लूप निष्पादित होने पर 1 से 10 तक की सभी संख्याओं को सूचीबद्ध करता है।
#!/bin/bash # A simple while loop counter=1 while [ $counter -le 10 ] do echo $counter ((counter++)) done
आइए while लूप पर चर्चा करें:
वेरिएबल counter को 1 पर इनिशियलाइज़ किया गया है। और जब तक वेरिएबल 10 से कम या बराबर है, काउंटर का मान तब तक इंक्रीमेंट किया जाएगा जब तक शर्त पूरी नहीं हो जाती। लाइन echo $counter 1 से 10 तक की सभी संख्याओं को प्रिंट करती है।
For लूप
While लूप की तरह, एक for लूप कोड को इटरेटिवली निष्पादित करने के लिए उपयोग किया जाता है। यानी उपयोगकर्ता द्वारा परिभाषित कई बार कोड निष्पादन दोहराएं।
सिंटैक्स है:
for var in 1 2 3 4 5 N do command1 command2 done
नीचे दिया गया for लूप 1 से 10 तक इटरेट करता है और उनके मानों को स्क्रीन पर प्रोसेस करता है।
इसे प्राप्त करने का एक बेहतर तरीका डबल कर्ली ब्रेसेस { } का उपयोग करके रेंज को परिभाषित करना है जैसा कि दिखाया गया है, सभी नंबर टाइप करने के बजाय।
#!/bin/bash
# Specify range in a for loop
for num in {1..10}
do
echo $num
done
Bash पोजिशनल पैरामीटर्स
एक पोजिशनल पैरामीटर एक विशेष वेरिएबल है जिसे स्क्रिप्ट में संदर्भित किया जाता है जब मान शेल पर पास किए जाते हैं लेकिन असाइन नहीं किए जा सकते। पोजिशनल पैरामीटर्स $0 $1 $2 $3 ... से $9 तक चलते हैं। $9 मान से आगे, पैरामीटर्स को कर्ली ब्रैकेट्स में संलग्न करना होगा जैसे ${10}, ${11} ... और इसी तरह।
स्क्रिप्ट निष्पादित करते समय, पहला पोजिशनल पैरामीटर जो $0 है, शेल स्क्रिप्ट का नाम लेता है। $1 पैरामीटर टर्मिनल पर पास किए गए पहले वेरिएबल को लेता है, $2 दूसरा लेता है, $3 तीसरा और इसी तरह।
आइए नीचे दिखाए अनुसार test.sh स्क्रिप्ट बनाएं।
#!/bin/bash echo "The name of the script is: " $0 echo "My first name is: " $1 echo "My second name is: " $2
अब, स्क्रिप्ट को निष्पादित करें और पहले और दूसरे नाम को तर्क के रूप में प्रदान करें:
# bash test.sh James Kiarie
आउटपुट से, हम देख सकते हैं कि प्रिंट किया गया पहला वेरिएबल शेल स्क्रिप्ट का नाम है, इस मामले में, test.sh। इसके बाद, नाम शेल स्क्रिप्ट में परिभाषित पोजिशनल पैरामीटर्स के अनुरूप प्रिंट किए जाते हैं।
पोजिशनल पैरामीटर्स उपयोगी हैं क्योंकि वे आपको स्पष्ट रूप से एक वेरिएबल को मान असाइन करने के बजाय दर्ज किए जा रहे डेटा को कस्टमाइज़ करने में मदद करते हैं।
शेल कमांड एग्जिट कोड्स
आइए एक सरल सवाल का जवाब देकर शुरू करें, एग्जिट कोड क्या है?
उपयोगकर्ता या शेल स्क्रिप्ट द्वारा शेल पर निष्पादित हर कमांड का एक एग्जिट स्टेटस होता है। एग्जिट स्टेटस एक इंटीजर है।
0 का एग्जिट स्टेटस इंगित करता है कि कमांड बिना किसी त्रुटि के सफलतापूर्वक निष्पादित हुआ। 1 से 255 के बीच कुछ भी दर्शाता है कि कमांड विफल हुआ या सफलतापूर्वक निष्पादित नहीं हुआ।
कमांड के एग्जिट स्टेटस को खोजने के लिए, $? शेल वेरिएबल का उपयोग करें।
1 का एग्जिट स्टेटस सामान्य त्रुटि या किसी भी अनुचित त्रुटि की ओर इशारा करता है जैसे बिना sudo परमिशन के फ़ाइलें एडिट करना।
2 का एग्जिट स्टेटस कमांड या बिल्टइन शेल वेरिएबल के गलत उपयोग की ओर इशारा करता है।
127 एग्जिट स्टेटस एक अवैध कमांड की ओर इशारा करता है जो आमतौर पर 'command not found' त्रुटि देता है।
स्क्रिप्ट के भीतर शेल कमांड्स के आउटपुट को प्रोसेस करना
Bash स्क्रिप्टिंग में, आप भविष्य के उपयोग के लिए एक वेरिएबल में कमांड के आउटपुट को स्टोर कर सकते हैं। इसे शेल कमांड सब्स्टीट्यूशन भी कहा जाता है और इसे निम्न तरीकों से प्राप्त किया जा सकता है।
variable=$(command) OR variable=$(/path/to/command) OR variable=$(command argument 1 argument 2 ...)
उदाहरण के लिए, आप date कमांड को today नामक वेरिएबल में स्टोर कर सकते हैं और वर्तमान तारीख प्रकट करने के लिए शेल स्क्रिप्ट को कॉल कर सकते हैं।
#!/bin/bash today=$(date) echo "Today is $today"
आइए एक और उदाहरण लें। मान लीजिए आप अपने लिनक्स सिस्टम पर वैध लॉगिन उपयोगकर्ताओं को ढूंढना चाहते हैं। आप इसके बारे में कैसे जाएंगे? पहले, सभी उपयोगकर्ताओं (सिस्टम, प्रोसेस, और लॉगिन उपयोगकर्ता दोनों) की सूची /etc/passwd फ़ाइल में स्टोर की जाती है।
फ़ाइल देखने के लिए, आपको cat कमांड का उपयोग करना होगा। हालांकि, लॉगिन उपयोगकर्ताओं तक सीमित करने के लिए, /bin/bash एट्रिब्यूट वाले उपयोगकर्ताओं को खोजने के लिए grep कमांड का उपयोग करें और पहले 10 कैरेक्टर्स प्रदर्शित करने के लिए cut -c 1-10 कमांड का उपयोग करें जैसा कि दिखाया गया है।
हमने cat कमांड को login_users वेरिएबल में स्टोर किया है।
#!/bin/bash login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10) echo 'This is the list of login users:' echo $login_users
यह सरल शेल स्क्रिप्ट बनाने पर हमारे ट्यूटोरियल का अंत करता है। हमें उम्मीद है कि आपको यह मूल्यवान लगा।