इस श्रृंखला के पहले लेख में, आपने अपना पहला, बहुत छोटा, वन-लाइन बैश स्क्रिप्ट बनाया और शेल स्क्रिप्ट्स बनाने के कारणों का पता लगाया। दूसरे लेख में, आपने एक काफी सरल टेम्पलेट बनाना शुरू किया जो अन्य बैश प्रोग्राम्स के लिए शुरुआती बिंदु हो सकता है और इसका परीक्षण शुरू किया। तीसरे लेख में, आपने एक साधारण हेल्प फ़ंक्शन बनाया और उपयोग किया और फ़ंक्शंस का उपयोग करने और -h जैसे कमांड-लाइन ऑप्शंस को कैसे संभालना है, इसके बारे में सीखा।
इस श्रृंखला का चौथा और अंतिम लेख वेरिएबल्स और उन्हें इनिशियलाइज़ करने के साथ-साथ यह कैसे करना है कि प्रोग्राम उचित परिस्थितियों में चलता है यह सुनिश्चित करने के लिए थोड़ी सी सैनिटी टेस्टिंग करने में जाता है। याद रखें, इस श्रृंखला का उद्देश्य काम करने वाला कोड बनाना है जिसे भविष्य की बैश प्रोग्रामिंग परियोजनाओं के लिए एक टेम्पलेट के रूप में उपयोग किया जाएगा। विचार यह है कि सामान्य तत्वों को टेम्पलेट में पहले से ही उपलब्ध कराकर नई प्रोग्रामिंग परियोजनाओं पर शुरुआत करना आसान बनाया जाए।
वेरिएबल्स
बैश शेल, सभी प्रोग्रामिंग भाषाओं की तरह, वेरिएबल्स को संभाल सकता है। एक वेरिएबल एक प्रतीकात्मक नाम है जो मेमोरी में एक विशिष्ट स्थान को संदर्भित करता है जिसमें किसी प्रकार का मान होता है। एक वेरिएबल का मान परिवर्तनशील होता है, यानी, यह वेरिएबल है। यदि आप वेरिएबल्स का उपयोग करने से परिचित नहीं हैं, तो आगे बढ़ने से पहले मेरा लेख बैश के साथ प्रोग्राम कैसे करें: सिंटैक्स और टूल्स पढ़ें।
हो गया? बढ़िया! आइए अब वेरिएबल्स का उपयोग करते समय कुछ अच्छी प्रथाओं को देखें।
मैं अपनी स्क्रिप्ट्स में उपयोग किए जाने वाले हर वेरिएबल के लिए प्रारंभिक मान हमेशा सेट करता हूँ। आप इसे अपने टेम्पलेट स्क्रिप्ट में प्रक्रियाओं के तुरंत बाद मुख्य प्रोग्राम बॉडी के पहले भाग के रूप में पा सकते हैं, इससे पहले कि यह ऑप्शंस को प्रोसेस करे। प्रत्येक वेरिएबल को एक उपयुक्त मान के साथ इनिशियलाइज़ करने से तुलना या गणित ऑपरेशन्स में अनइनिशियलाइज़्ड वेरिएबल्स के साथ होने वाली त्रुटियों को रोका जा सकता है। वेरिएबल्स की इस सूची को एक स्थान पर रखने से आप स्क्रिप्ट में होने वाले सभी वेरिएबल्स और उनके प्रारंभिक मानों को देख सकते हैं।
आपकी छोटी स्क्रिप्ट में अभी तक केवल एक वेरिएबल, $option, है। इसे निम्न लाइनों को डालकर सेट करें जैसा दिखाया गया है:
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
# Initialize variables
option=""
################################################################################
# Process the input options. Add options as needed. #
################################################################################
यह सुनिश्चित करने के लिए इसका परीक्षण करें कि सब कुछ वैसा ही काम करता है जैसा होना चाहिए और इस परिवर्तन के परिणामस्वरूप कुछ भी टूटा नहीं है।
कॉन्स्टेंट्स
कॉन्स्टेंट्स भी वेरिएबल्स हैं—कम से कम उन्हें होना चाहिए। कमांड-लाइन इंटरफेस (CLI) प्रोग्राम्स में हार्ड-कोडेड मानों के बजाय जहां भी संभव हो वेरिएबल्स का उपयोग करें। यहां तक कि अगर आपको लगता है कि आप किसी विशेष मान (जैसे डायरेक्टरी नाम, फाइल नाम, या टेक्स्ट स्ट्रिंग) का उपयोग केवल एक बार करेंगे, तो एक वेरिएबल बनाएं और उसका उपयोग वहां करें जहां आपने हार्ड-कोडेड नाम रखा होता।
उदाहरण के लिए, प्रोग्राम के मुख्य भाग के भाग के रूप में प्रिंट किया गया संदेश एक स्ट्रिंग लिटरल है, echo "Hello world!"। इसे एक वेरिएबल में बदलें। पहले, वेरिएबल इनिशियलाइज़ेशन सेक्शन में निम्न स्टेटमेंट जोड़ें:
Msg="Hello world!"
और अब प्रोग्राम की अंतिम लाइन को बदलें:
echo "Hello world!"
से:
echo "$Msg"
परिणामों का परीक्षण करें।
सैनिटी चेक्स
सैनिटी चेक्स केवल उन कंडीशन्स के लिए टेस्ट हैं जो प्रोग्राम के सही ढंग से काम करने के लिए सत्य होनी चाहिए, जैसे: प्रोग्राम को रूट यूजर के रूप में चलाया जाना चाहिए, या इसे किसी विशेष डिस्ट्रीब्यूशन और उस डिस्ट्रो के रिलीज़ पर चलना चाहिए। अपने सरल प्रोग्राम टेम्पलेट में रनिंग यूजर के रूप में रूट के लिए एक चेक जोड़ें।
यह टेस्ट करना कि रूट यूजर प्रोग्राम चला रहा है, आसान है क्योंकि एक प्रोग्राम उस यूजर के रूप में चलता है जो इसे लॉन्च करता है।
id कमांड का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि प्रोग्राम किस न्यूमेरिक यूजर ID (UID) के तहत चल रहा है। जब इसे बिना किसी ऑप्शन के उपयोग किया जाता है तो यह कई जानकारी प्रदान करता है:
[student@testvm1 ~]$ id
uid=1001(student) gid=1001(student) groups=1001(student),5000(dev)
-u ऑप्शन का उपयोग करके केवल यूजर का UID लौटाया जाता है, जिसे आपके बैश प्रोग्राम में आसानी से उपयोग किया जा सकता है:
[student@testvm1 ~]$ id -u
1001
[student@testvm1 ~]$
निम्न फ़ंक्शन को प्रोग्राम में जोड़ें। मैंने इसे हेल्प प्रोसीजर के बाद जोड़ा, लेकिन आप इसे प्रोसीजर सेक्शन में कहीं भी रख सकते हैं। लॉजिक यह है कि यदि UID शून्य नहीं है, जो हमेशा रूट यूजर का UID होता है, तो प्रोग्राम समाप्त हो जाता है:
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
अब, वेरिएबल के इनिशियलाइज़ेशन से ठीक पहले CheckRoot प्रोसीजर को कॉल करें। इसका परीक्षण करें, पहले प्रोग्राम को स्टूडेंट यूजर के रूप में चलाकर:
[student@testvm1 ~]$ ./hello
ERROR: You must be root user to run this program
[student@testvm1 ~]$
फिर रूट यूजर के रूप में:
[root@testvm1 student]# ./hello
Hello world!
[root@testvm1 student]#
आपको हमेशा इस विशेष सैनिटी टेस्ट की आवश्यकता नहीं हो सकती है, इसलिए CheckRoot की कॉल को कमेंट आउट करें लेकिन सभी कोड को टेम्पलेट में जगह पर छोड़ दें। इस तरह, भविष्य के प्रोग्राम में उस कोड का उपयोग करने के लिए आपको केवल कॉल को अनकमेंट करना होगा।
कोड
ऊपर उल्लिखित परिवर्तन करने के बाद, आपका कोड इस तरह दिखना चाहिए:
#!/usr/bin/bash
################################################################################
# scriptTemplate #
# #
# Use this template as the beginning of a new program. Place a short #
# description of the script here. #
# #
# Change History #
# 11/11/2019 David Both Original code. This is a template for creating #
# new Bash shell scripts. #
# Add new history entries as needed. #
# #
# #
################################################################################
################################################################################
################################################################################
################################################################################
# #
# Copyright (C) 2007, 2019 David Both #
# LinuxGeek46@both.org #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
################################################################################
################################################################################
################################################################################
################################################################################
# Help #
################################################################################
Help()
{
# Display Help
echo "Add description of the script functions here."
echo
echo "Syntax: scriptTemplate [-g|h|v|V]"
echo "options:"
echo "g Print the GPL license notification."
echo "h Print this Help."
echo "v Verbose mode."
echo "V Print software version and exit."
echo
}
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
# If we are not running as root we exit the program
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# Sanity checks #
################################################################################
# Are we rnning as root?
# CheckRoot
# Initialize variables
option=""
Msg="Hello world!"
################################################################################
# Process the input options. Add options as needed. #
################################################################################
# Get the options
while getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
\?) # incorrect option
echo "Error: Invalid option"
exit;;
esac
done
echo "$Msg"
एक अंतिम अभ्यास
आपने शायद देखा होगा कि आपके कोड में हेल्प फ़ंक्शन उन सुविधाओं को संदर्भित करता है जो कोड में नहीं हैं। अंतिम अभ्यास के रूप में, पता लगाएं कि उन फ़ंक्शन्स को आपके द्वारा बनाए गए कोड टेम्पलेट में कैसे जोड़ा जाए।
सारांश
इस लेख में, आपने यह जांचने के लिए एक सनिटी टेस्ट करने के लिए कुछ फ़ंक्शन्स बनाए कि क्या आपका प्रोग्राम रूट के रूप में चल रहा है। आपका प्रोग्राम थोड़ा अधिक जटिल हो रहा है, इसलिए टेस्टिंग अधिक महत्वपूर्ण होती जा रही है और पूर्ण होने के लिए अधिक टेस्ट पथ्स की आवश्यकता है।
इस श्रृंखला ने एक बहुत ही न्यूनतम बैश प्रोग्राम को देखा और इसे थोड़ा-थोड़ा करके कैसे बनाया जाए। परिणाम एक सरल टेम्पलेट है जो अन्य, अधिक उपयोगी बैश स्क्रिप्ट्स के लिए शुरुआती बिंदु हो सकता है और जिसमें उपयोगी तत्व हैं जो नई स्क्रिप्ट्स शुरू करना आसान बनाते हैं।
अब तक, आपको विचार मिल गया है: संकलित प्रोग्राम आवश्यक हैं और एक बहुत महत्वपूर्ण आवश्यकता को पूरा करते हैं। लेकिन सिसएडमिन्स के लिए, हमेशा एक बेहतर तरीका होता है। हमेशा अपनी नौकरी की ऑटोमेशन जरूरतों को पूरा करने के लिए शेल स्क्रिप्ट्स का उपयोग करें। शेल स्क्रिप्ट्स खुली हैं; उनकी सामग्री और उद्देश्य ज्ञात हैं। उन्हें विभिन्न आवश्यकताओं को पूरा करने के लिए आसानी से संशोधित किया जा सकता है। मुझे अपनी सिसएडमिन भूमिका में ऐसा कुछ भी नहीं मिला जिसे शेल स्क्रिप्ट से पूरा नहीं किया जा सकता।
आपने इस श्रृंखला में अब तक जो बनाया है वह सिर्फ शुरुआत है। जैसे-जैसे आप अधिक बैश प्रोग्राम लिखते हैं, आप कोड के और टुकड़े ढूंढेंगे जिनका आप अक्सर उपयोग करते हैं और जिन्हें आपके प्रोग्राम टेम्पलेट में शामिल किया जाना चाहिए।
संसाधन
- बैश के साथ प्रोग्राम कैसे करें: सिंटैक्स और टूल्स
- बैश के साथ प्रोग्राम कैसे करें: लॉजिकल ऑपरेटर्स और शेल एक्सपैंशन
- बैश के साथ प्रोग्राम कैसे करें: लूप्स
यह लेख श्रृंखला डेविड बोथ के तीन-भाग वाले लिनक्स सेल्फ-स्टडी कोर्स, Using and Administering Linux—Zero to SysAdmin के वॉल्यूम 2, अध्याय 10 पर आंशिक रूप से आधारित है।