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

अपनी बैश स्क्रिप्ट को बेहतर बनाने के 5 तरीके

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

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

शुरू हो रहा है

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

cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz

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

1. सशर्त बयान

कई अन्य प्रोग्रामिंग भाषाओं की तरह, सशर्त एक शक्तिशाली और सामान्य विशेषता रही है। एक सशर्त वह है जो कंप्यूटर प्रोग्राम द्वारा तर्क को निष्पादित करने में सक्षम बनाता है। मेरे अधिकांश उदाहरण सशर्त तर्क पर आधारित हैं।

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

if [ -d "$JAVA_HOME/bin" ] ; then
    PATH="$JAVA_HOME/bin:$PATH"

2. निष्पादन सीमित करें

हो सकता है कि आप किसी स्क्रिप्ट को केवल एक विशिष्ट उपयोगकर्ता द्वारा चलाए जाने के लिए सीमित करना चाहें। हालांकि लिनक्स के पास उपयोगकर्ताओं और समूहों के लिए मानक अनुमतियां हैं, साथ ही इस प्रकार की सुरक्षा को सक्षम करने के लिए SELinux, आप स्क्रिप्ट के भीतर तर्क रखना चुन सकते हैं। शायद आप यह सुनिश्चित करना चाहते हैं कि केवल किसी विशेष वेब एप्लिकेशन का स्वामी ही इसकी स्टार्टअप स्क्रिप्ट चला सकता है। आप स्क्रिप्ट को रूट उपयोगकर्ता तक सीमित करने के लिए कोड का भी उपयोग कर सकते हैं। लिनक्स में कुछ पर्यावरण चर हैं जिन्हें हम इस तर्क में परीक्षण कर सकते हैं। एक है $USER , जो उपयोगकर्ता नाम प्रदान करता है। दूसरा है $UID , जो उपयोगकर्ता की पहचान संख्या (यूआईडी) और, स्क्रिप्ट के मामले में, निष्पादित उपयोगकर्ता का यूआईडी प्रदान करता है।

उपयोगकर्ता

पहला उदाहरण दिखाता है कि मैं कई एप्लिकेशन सर्वर इंस्टेंस के साथ एक बहु-होस्टिंग वातावरण में उपयोगकर्ता jboss1 के लिए एक स्क्रिप्ट को कैसे सीमित कर सकता हूं। सशर्त "अगर" कथन अनिवार्य रूप से पूछता है, "क्या निष्पादन उपयोगकर्ता jboss1 नहीं है?" जब स्थिति सही पाई जाती है, तो पहले इको स्टेटमेंट को कॉल किया जाता है, उसके बाद एग्जिट 1, कहा जाता है। जो स्क्रिप्ट को समाप्त करता है।

if [ "$USER" != 'jboss1' ]; then
     echo "Sorry, this script must be run as JBOSS1!"
     exit 1
fi
echo "continue script"

रूट

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

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 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. विफलता पर बाहर निकलें

कुछ साल पहले, मैंने अपने कंप्यूटर पर जावा डेवलपमेंट किट (JDK) के नवीनतम संस्करण को स्थापित करने के लिए एक स्क्रिप्ट लिखी थी। स्क्रिप्ट JDK संग्रह को एक विशिष्ट निर्देशिका में निकालती है, एक प्रतीकात्मक लिंक को अपडेट करती है, और सिस्टम को नए संस्करण से अवगत कराने के लिए वैकल्पिक उपयोगिता का उपयोग करती है। यदि JDK संग्रह का निष्कर्षण विफल हो जाता है, तो जारी रखने से जावा सिस्टम-वाइड टूट सकता है। इसलिए, मैं चाहता था कि ऐसी स्थिति में स्क्रिप्ट को निरस्त कर दिया जाए। मैं नहीं चाहता कि स्क्रिप्ट सिस्टम के अगले सेट में बदलाव करे जब तक कि संग्रह को सफलतापूर्वक निकाला नहीं गया। निम्नलिखित उस स्क्रिप्ट का एक अंश है:

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

सबसे पहले, T स्पर्श करें run चलाएं इस आदेश के बाद। ec . का मान 0 होगा। फिर, T delete हटाएं , आरएम टी , और आदेश दोहराएं। ec . का मान अब 2 होगा क्योंकि ls T . के बाद से एक त्रुटि स्थिति की रिपोर्ट करता है नहीं मिला।

आप अपनी स्क्रिप्ट के व्यवहार को नियंत्रित करने के लिए तर्क को शामिल करने के लिए इस त्रुटि रिपोर्टिंग का लाभ उठा सकते हैं, जैसा कि मैंने ऊपर बताया है।

टेकअवे

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


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

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

  1. बैश-इट - बैश फ्रेमवर्क आपकी लिपियों और उपनामों को नियंत्रित करने के लिए

    बैश-इट बैश 3.2+ . के लिए समुदाय बैश कमांड और स्क्रिप्ट का एक बंडल है , जो स्वतः पूर्णता, थीम, उपनाम, कस्टम फ़ंक्शन, और बहुत कुछ के साथ आता है। यह आपके दैनिक कार्य के लिए शेल स्क्रिप्ट और कस्टम कमांड के विकास, रखरखाव और उपयोग के लिए एक उपयोगी ढांचा प्रदान करता है। यदि आप दैनिक आधार पर बैश शेल का उपय

  1. लिनक्स में प्रभावी बैश स्क्रिप्ट लिखने के लिए 10 उपयोगी टिप्स

    शेल स्क्रिप्टिंग प्रोग्रामिंग का सबसे आसान रूप है जिसे आप लिनक्स में सीख सकते हैं/कर सकते हैं। इसके अलावा, यह सिस्टम प्रशासन के लिए कार्यों को स्वचालित करने, नई सरल उपयोगिताओं/उपकरणों को विकसित करने के लिए एक आवश्यक कौशल है, लेकिन कुछ का उल्लेख करने के लिए। इस लेख में, हम प्रभावी और विश्वसनीय बैश स