एक सिस्टम एडमिन अक्सर विभिन्न कार्यों को पूरा करने के लिए बैश स्क्रिप्ट्स लिखता है, कुछ छोटी और कुछ काफी लंबी।
क्या आपने कभी किसी सॉफ़्टवेयर विक्रेता द्वारा प्रदान की गई इंस्टॉलेशन स्क्रिप्ट को देखा है? वे अक्सर यह सुनिश्चित करने के लिए बहुत सारे फ़ंक्शन्स और लॉजिक जोड़ते हैं कि इंस्टॉलेशन ठीक से काम करे और ग्राहक के सिस्टम को नुकसान न पहुंचे। वर्षों से, मैंने अपनी बैश स्क्रिप्ट्स को बेहतर बनाने के लिए विभिन्न तकनीकों का एक संग्रह एकत्र किया है, और मुझे उम्मीद है कि वे दूसरों की मदद कर सकते हैं। यहां इन सरल उदाहरणों को दर्शाने के लिए बनाए गए छोटे स्क्रिप्ट्स का एक संग्रह है।
शुरुआत
जब मैं शुरू कर रहा था, मेरी बैश स्क्रिप्ट्स कमांड्स की एक श्रृंखला से अधिक कुछ नहीं थीं, आमतौर पर मानक शेल ऑपरेशन्स जैसे वेब कंटेंट डेप्लॉय करने के साथ समय बचाने के लिए। ऐसा ही एक कार्य Apache वेब सर्वर के होम डायरेक्टरी में स्टेटिक कंटेंट निकालना था। मेरी स्क्रिप्ट कुछ इस तरह थी:
cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz
हालांकि इसने मुझे कुछ समय और टाइपिंग बचाई, लेकिन यह लंबी अवधि में एक बहुत दिलचस्प या उपयोगी स्क्रिप्ट नहीं थी। समय के साथ, मैंने बैश स्क्रिप्ट्स का उपयोग अधिक चुनौतीपूर्ण कार्यों को पूरा करने के लिए करना सीखा, जैसे सॉफ़्टवेयर पैकेज बनाना, सॉफ़्टवेयर इंस्टॉल करना, या फाइल सर्वर का बैकअप लेना।
1. कंडीशनल स्टेटमेंट
कई अन्य प्रोग्रामिंग भाषाओं की तरह, कंडीशनल एक शक्तिशाली और सामान्य विशेषता रही है। एक कंडीशनल वही है जो कंप्यूटर प्रोग्राम द्वारा लॉजिक को निष्पादित करने में सक्षम बनाता है। मेरे अधिकांश उदाहरण कंडीशनल लॉजिक पर आधारित हैं।
बुनियादी कंडीशनल एक "if" स्टेटमेंट का उपयोग करता है। यह हमें किसी ऐसी कंडीशन का परीक्षण करने की अनुमति देता है जिसका उपयोग हम यह नियंत्रित करने के लिए कर सकते हैं कि स्क्रिप्ट कैसे प्रदर्शन करती है। उदाहरण के लिए, हम Java बिन डायरेक्टरी के अस्तित्व की जांच कर सकते हैं, जो इंगित करेगा कि Java इंस्टॉल है। यदि मिलता है, तो Java एप्लिकेशन्स द्वारा कॉल को सक्षम करने के लिए एक्ज़ीक्यूटेबल पथ को स्थान के साथ अपडेट किया जा सकता है।
if [ -d "$JAVA_HOME/bin" ] ; then
PATH="$JAVA_HOME/bin:$PATH"
2. एक्ज़ीक्यूशन सीमित करें
आप एक स्क्रिप्ट को केवल एक विशिष्ट यूजर द्वारा चलाने योग्य बनाना चाह सकते हैं। हालांकि लिनक्स में यूजर्स और ग्रुप्स के लिए मानक अनुमतियां हैं, साथ ही इस प्रकार की सुरक्षा को सक्षम करने के लिए SELinux भी है, आप एक स्क्रिप्ट के भीतर लॉजिक रखना चुन सकते हैं। शायद आप सुनिश्चित करना चाहते हैं कि किसी विशेष वेब एप्लिकेशन का मालिक ही उसका स्टार्टअप स्क्रिप्ट चला सकता है। आप रूट यूजर तक स्क्रिप्ट को सीमित करने के लिए भी कोड का उपयोग कर सकते हैं। लिनक्स में कुछ एनवायरनमेंट वेरिएबल्स हैं जिनका हम इस लॉजिक में परीक्षण कर सकते हैं। एक है $USER, जो यूजरनेम प्रदान करता है। दूसरा है $UID, जो यूजर की आइडेंटिफिकेशन नंबर (UID) प्रदान करता है और, स्क्रिप्ट के मामले में, निष्पादित करने वाले यूजर का UID।
यूजर
पहला उदाहरण दिखाता है कि कैसे मैं कई एप्लिकेशन सर्वर इंस्टेंस के साथ मल्टी-होस्टिंग एनवायरनमेंट में यूजर jboss1 तक एक स्क्रिप्ट को सीमित कर सकता हूं। कंडीशनल "if" स्टेटमेंट अनिवार्य रूप से पूछता है, "क्या निष्पादित करने वाला यूजर jboss1 नहीं है?" जब कंडीशन सत्य पाई जाती है, तो पहला echo स्टेटमेंट कॉल किया जाता है, उसके बाद exit 1, जो स्क्रिप्ट को समाप्त करता है।
if [ "$USER" != 'jboss1' ]; then
echo "Sorry, this script must be run as JBOSS1!"
exit 1
fi
echo "continue script"
रूट
यह अगला उदाहरण स्क्रिप्ट सुनिश्चित करता है कि केवल रूट यूजर ही इसे निष्पादित कर सकता है। क्योंकि रूट के लिए UID 0 है, हम कंडीशनल if स्टेटमेंट में -gt ऑप्शन का उपयोग करके शून्य से अधिक सभी UIDs को प्रतिबंधित कर सकते हैं।
if [ "$UID" -gt 0 ]; then
echo "Sorry, this script must be run as ROOT!"
exit 1
fi
echo "continue script"
3. आर्गुमेंट्स का उपयोग करें
किसी भी निष्पादन योग्य प्रोग्राम की तरह, बैश स्क्रिप्ट्स इनपुट के रूप में आर्गुमेंट्स ले सकती हैं। नीचे कुछ उदाहरण हैं। लेकिन पहले, आपको यह समझना चाहिए कि अच्छी प्रोग्रामिंग का अर्थ है कि हम केवल ऐसे एप्लिकेशन नहीं लिखते जो हम चाहते हैं; हमें ऐसे एप्लिकेशन लिखने चाहिए जो वह नहीं कर सकें जो हम नहीं चाहते। मैं यह सुनिश्चित करना पसंद करता हूं कि कोई आर्गुमेंट न होने की स्थिति में स्क्रिप्ट कुछ भी विनाशकारी न करे। इसलिए, यह पहली जांच है जो y. कंडीशन आर्गुमेंट्स की संख्या, $#, की जांच करती है कि क्या यह शून्य है और यदि सत्य है तो स्क्रिप्ट को समाप्त करती है।
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
echo "arguments found: $#"
एकाधिक आर्गुमेंट्स
आप एक स्क्रिप्ट को एक से अधिक आर्गुमेंट पास कर सकते हैं। आंतरिक वेरिएबल्स जिनका उपयोग स्क्रिप्ट प्रत्येक आर्गुमेंट को संदर्भित करने के लिए करती है, वे केवल बढ़ते हैं, जैसे $1, $2, $3, और इसी तरह। मैं ऊपर अपने उदाहरण को निम्न लाइन के साथ विस्तारित करूंगा ताकि पहले तीन आर्गुमेंट्स को इको किया जा सके। जाहिर है, कुल संख्या के आधार पर उचित आर्गुमेंट हैंडलिंग के लिए अतिरिक्त लॉजिक की आवश्यकता होगी। यह उदाहरण प्रदर्शन के लिए सरल है।
echo $1 $2 $3
जब हम इन आर्गुमेंट वेरिएबल्स पर चर्चा कर रहे हैं, तो आपने सोचा होगा, "क्या उसने ज़ीरो को छोड़ दिया?"
खैर, हाँ, मैंने किया, लेकिन मेरे पास एक बढ़िया कारण है! वास्तव में एक $0 वेरिएबल है, और यह बहुत उपयोगी है। इसका मान केवल निष्पादित की जा रही स्क्रिप्ट का नाम है।
echo $0
निष्पादन के दौरान स्क्रिप्ट के नाम का संदर्भ देने का एक महत्वपूर्ण कारण एक लॉग फाइल उत्पन्न करना है जिसमें उसके अपने नाम में स्क्रिप्ट का नाम शामिल हो। सबसे सरल रूप केवल एक echo स्टेटमेंट हो सकता है।
echo test >> $0.log
हालांकि, आप शायद यह सुनिश्चित करने के लिए थोड़ा और कोड जोड़ना चाहेंगे कि लॉग को उस स्थान पर लिखा जाए जिसका नाम और जानकारी आपके उपयोग के मामले के लिए उपयोगी हो।
4. यूजर इनपुट
स्क्रिप्ट में उपयोग करने के लिए एक और उपयोगी विशेषता निष्पादन के दौरान इनपुट स्वीकार करने की इसकी क्षमता है। सबसे सरल है यूजर को कुछ इनपुट देना।
echo "enter a word please:"
read word
echo $word
यह आपको यूजर को विकल्प प्रदान करने की भी अनुमति देता है।
read -p "Install Software ?? [Y/n]: " answ
if [ "$answ" == 'n' ]; then
exit 1
fi
echo "Installation starting..."
5. विफलता पर बाहर निकलें
कुछ साल पहले, मैंने अपने कंप्यूटर पर Java Development Kit (JDK) का नवीनतम संस्करण इंस्टॉल करने के लिए एक स्क्रिप्ट लिखी थी। स्क्रिप्ट JDK आर्काइव को एक विशिष्ट डायरेक्टरी में निकालती है, एक सिम्बोलिक लिंक अपडेट करती है, और सिस्टम को नए संस्करण से अवगत कराने के लिए alternatives यूटिलिटी का उपयोग करती है। यदि JDK आर्काइव का निष्कर्षण विफल हुआ, तो जारी रखने से Java सिस्टम-व्यापी टूट सकता है। इसलिए, मैं चाहता था कि स्क्रिप्ट ऐसी स्थिति में रुक जाए। मैं नहीं चाहता कि स्क्रिप्ट सिस्टम परिवर्तनों का अगला सेट बनाए जब तक कि आर्काइव सफलतापूर्वक निकाला न गया हो। उस स्क्रिप्ट का एक अंश यहां दिया गया है:
tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
echo "Installation failed - exiting."
exit 1
fi
$? वेरिएबल के उपयोग को प्रदर्शित करने का आपके लिए एक त्वरित तरीका यह छोटा वन-लाइनर है:
ls T; ec=$?; echo $ec
पहले, इस कमांड के बाद touch T चलाएं। ec का मान 0 होगा। फिर, T को डिलीट करें, rm T, और कमांड दोहराएं। ec का मान अब 2 होगा क्योंकि ls एक त्रुटि स्थिति की रिपोर्ट करता है क्योंकि T नहीं मिला।
आप अपनी स्क्रिप्ट्स के व्यवहार को नियंत्रित करने के लिए लॉजिक शामिल करने के लिए इस त्रुटि रिपोर्टिंग का लाभ उठा सकते हैं, जैसा कि मैंने ऊपर किया है।
निष्कर्ष
हम मान सकते हैं कि उच्च कार्यक्षमता के लिए हमें Python, C, या Java जैसी भाषाओं को नियोजित करने की आवश्यकता है, लेकिन यह जरूरी नहीं है। बैश स्क्रिप्टिंग भाषा बहुत शक्तिशाली है। इसकी उपयोगिता को अधिकतम करने के लिए बहुत कुछ सीखना है। मुझे आशा है कि ये कुछ उदाहरण बैश के साथ कोडिंग की क्षमता पर कुछ प्रकाश डालेंगे।