কম্পিউটার টিউটোরিয়াল

ব্যাশ স্ক্রিপ্ট টেস্টিং নিপুণতা: উন্নত কৌশল ও সেরা অনুশীলন

এই সিরিজের প্রথম আর্টিকেলে, আপনি আপনার প্রথম, খুব ছোট, এক-লাইনের ব্যাশ স্ক্রিপ্ট তৈরি করেছিলেন এবং শেল স্ক্রিপ্ট তৈরি করার কারণগুলো এক্সপ্লোর করেছিলেন। দ্বিতীয় আর্টিকেলে, আপনি একটি نسبتন بسيطة টেমপ্লেট তৈরি करना শুরু করেছিলেন যা অন্যান্য ব্যাশ প্রোগ্রামের জন্য একটি শুরুর বিন্দু হতে পারে এবং তা টেস্ট करना শুরু করেছিলেন। তৃতীয় আর্টিকেলে, আপনি একটি সহজ Help ফাংশন তৈরি এবং ব্যবহার করেছিলেন এবং ফাংশন ব্যবহার এবং কমান্ড-লাইন অপশন যেমন -h হ্যান্ডেল করার বিষয়ে শিখেছিলেন।

সিরিজের এই চতুর্থ এবং চূড়ান্ত আর্টিকেলে ভেরিয়েবল এবং তাদের ইনিশিয়ালাইজেশন এবং কীভাবে কিছু স্যানিটি টেস্ট করতে হয় যাতে প্রোগ্রাম সঠিক কন্ডিশনে রান করে সেটি নিশ্চিত করা যায় সেটি নিয়ে আলোচনা করা হয়েছে। মনে রাখবেন, এই সিরিজের উদ্দেশ্য হল ওয়ার্কিং কোড তৈরি করা যা ভবিষ্যতের ব্যাশ প্রোগ্রামিং প্রজেক্টের জন্য একটি টেমপ্লেট হিসেবে ব্যবহার করা যাবে। ধারণা হচ্ছে কমন এলিমেন্টগুলো টেমপ্লেটে ইতিমধ্যে উপলব্ধ থাকায় নতুন প্রোগ্রামিং প্রজেক্টে শুরু করা সহজ করা।

ভেরিয়েবল

ব্যাশ শেল, সকল প্রোগ্রামিং ভাষার মতো, ভেরিয়েবল হ্যান্ডেল করতে পারে। একটি ভেরিয়েবল হল একটি সিম্বোলিক নাম যা মেমোরির একটি নির্দিষ্ট লোকেশনকে রেফার করে যেটি কোনো একটি ভ্যালু ধারণ করে। একটি ভেরিয়েবলের ভ্যালু পরিবর্তনশীল, অর্থাৎ এটি variable। আপনি যদি ভেরিয়েবল ব্যবহার করতে পরিচিত নন, এই আর্টিকেল How to program with Bash: Syntax and tools পড়ুন আগে যাওয়ার আগে।

হয়েছে? দুর্দান্ত! এখন ভেরিয়েবল ব্যবহার করার কিছু ভালো অনুশীলন দেখি।

আমি সবসময় আমার স্ক্রিপ্টে ব্যবহৃত প্রতিটি ভেরিয়েবলের ইনিশিয়াল ভ্যালু সেট করি। আপনি আপনার টেমপ্লেট স্ক্রিপ্টে এটি পাবেন প্রোসিজারসের তত্ক्षণাৎপর মেইন প্রোগ্রাম বডির প্রথম অংশ হিসেবে, অপশনগুলো প্রসেস করার আগে। প্রতিটি ভেরিয়েবলকে একটি উপযুক্ত ভ্যালু দিয়ে ইনিশিয়ালাইজ করলে আনইনিশিয়ালাইজড ভেরিয়েবল থেকে কম্পেরিজন বা ম্যাথ অপারেশনে হতে পারে এমন এররগুলো রোধ করা যায়। এই ভেরিয়েবল লিস্টকে এক জায়গায় রাখলে আপনি স্ক্রিপ্টে থাকা উচিত সকল ভেরিয়েবল এবং তাদের ইনিশিয়াল ভ্যালু দেখতে পারেন।

আপনার ছোট স্ক্রিপ্টে এখন পর্যন্ত শুধু একটি ভেরিয়েবল, $option, আছে। নিচে দেখানো লাইনগুলো ইনসার্ট করুন যেন এটি সেট হয়:

################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
# Initialize variables
option=""
################################################################################
# Process the input options. Add options as needed. #
################################################################################

এটি টেস্ট করুন যেন সবকিছু যেন ঠিকঠাক কাজ করছে এবং এই পরিবর্তনের ফলে কিছু ভাঙলো না।

কনস্ট্যান্টস

কনস্ট্যান্টসও ভেরিয়েবল—কমপক্ষে সেগুলো হওয়া উচিত। কমান্ড-লাইন ইন্টারফেস (সিএলআই) প্রোগ্রামে হård-কোডেড ভ্যালুর বদলে যেখানেই সম্ভব ভেরিয়েবল ব্যবহার করুন। যদি আপনি মনে করেন আপনি একটি নির্দিষ্ট ভ্যালু (যেন একটি ডিরেক্টরি নাম, একটি ফাইল নাম, বা একটি টেক্সট স্ট্রিং) শুধু একবার ব্যবহার করবেন, একটি ভেরিয়েবল তৈরি করুন এবং সেটি ব্যবহার করুন সেখানে যেখানে আপনি হার্ড-কোডেড নামটি রাখতেন।

উদাহরণস্বরূপ, প্রোগ্রামের মেইন বডির অংশ হিসেবে প্রিন্ট হওয়া মেসেজটি একটি স্ট্রিং লিটারেল, echo "Hello world!"। এটিকে একটি ভেরিয়েবলে পরিবর্তন করুন। প্রথম, ভেরিয়েবল ইনিশিয়ালাইজেশন সেকশনে নিচের স্টেটমেন্টটি যোগ করুন:

Msg="Hello world!"

এখন প্রোগ্রামের লাস্ট লাইনটি পরিবর্তন করুন:

echo "Hello world!"

থেকে:

echo "$Msg"

ফলাফল টেস্ট করুন।

স্যানিটি চেকস

স্যানিটি চেকগুলোই হল সেই কন্ডিশনগুলোর টেস্ট যেগুলো সত্য হতে হবে প্রোগ্রাম সঠিকভাবে কাজ করার জন্য, যেন: প্রোগ্রামটি রুট ইউজার হিসেবে রান হতে হবে, বা এটা একটি নির্দিষ্ট ডিস্ট্রো এবং সেই ডিস্ট্রোর রিলিজে রান করতে হবে। আপনার সিম্পল প্রোগ্রাম টেমপ্লেটে root রানিং ইউজার হিসেবে চেক করার একটি চেক যোগ করুন।

প্রোগ্রামটি রুট ইউজার দ্বারা রান হচ্ছে কিনা টেস্ট করা সহজ কারণ একটি প্রোগ্রাম সে ইউজার হিসেবে রান করে যেটি এটি লঞ্চ করে।

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 ~]$

নিচের ফাংশনটি প্রোগ্রামে যোগ করুন। আমি এটি Help প্রসিজারের পরে যোগ করলাম, কিন্তু আপনি প্রসিজারস সেকশনে কোথাও রাখতে পারেন। লজিকটি হল যদি 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 ইউজার হিসেবে প্রোগ্রাম রান করে:

[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"

একটি চূড়ান্ত এক্সারসাইজ

আপনি হয়তো লক্ষ্য করেছেন যে আপনার কোডের Help ফাংশন কিছু ফিচার রেফার করছে যা কোডে নেই। একটি চূড়ান্ত এক্সারসাইজ হিসেবে, ফিগার আউট করুন কীভাবে আপনার তৈরি করা কোড টেমপ্লেটে সেসব ফাংশন যোগ করা যায়।

সারসংক্ষেপ

এই আর্টিকেলে, আপনি একটি কাপল ফাংশন তৈরি করেছেন আপনার প্রোগ্রাম রুট হিসেবে রান হচ্ছে কিনা সেটি স্যানিটি টেস্ট করার জন্য। আপনার প্রোগ্রাম কিছুটা বেশি কমপ্লেক্স হচ্ছে, তাই টেস্টিং আরও গুরুত্বপূর্ণ হচ্ছে এবং কমপ্লিট হতে আরও টেস্ট পাথ দরকার।

এই সিরিজে একটি খুব মিনিমাল ব্যাশ প্রোগ্রাম এবং কীভাবে একটি স্ক্রিপ্টকে একটু একটু করে বিল্ড আপ করা যায় সেটি देखा হয়েছে। ফলাফল হল একটি সহজ টেমপ্লেট যা অন্যান্য, আরও উপকারী ব্যাশ স্ক্রিপ্টের জন্য শুরুর বিন্দু হতে পারে এবং যেটি উপকারী এলিমেন্ট ধারণ করে যা নতুন স্ক্রিপ্ট শুরু করা সহজ করে দেয়।

আপনি এখন ধারণা পেয়ে গেছেন: কম্পাইলড প্রোগ্রাম প্রয়োজনীয় এবং খুব গুরুত্বপূর্ণ চাহিদা পূরণ করে। কিন্তু সিস্টেম অ্যাডমিনদের জন্য, সবসময় একটি ভালো উপায় আছে। আপনার জবের অটোমেশন চাহিদা পূরণ করার জন্য সবসময় শেল স্ক্রিপ্ট ব্যবহার করুন। শেল স্ক্রিপ্ট ওপেন; তাদের কন্টেন্ট এবং উদ্দেশ্য জানা যায়। সেগুলো সহজে মডিফাই করা যায় বিভিন্ন রিকোয়ারমেন্ট মিট করতে। আমি কখনো আমার সিস্টেম অ্যাডমিন রোলে আমার যা করতে হয় সেটি শেল স্ক্রিপ্ট দিয়ে করা যায়নি এমন কিছু খুঁজে পাইনি।

এতক্ষণে আপনি এই সিরিজে যা তৈরি করেছেন সেটি শুধু শুরু। আপনি যত বেশি ব্যাশ প্রোগ্রাম লিখবেন, তত বেশি কোড বিট খুঁজে পাবেন যেগুলো আপনি ঘন ঘন ব্যবহার করেন এবং আপনার প্রোগ্রাম টেমপ্লেটে অন্তর্ভুক্ত করা উচিত।

রিসোর্স

  • How to program with Bash: Syntax and tools
  • How to program with Bash: Logical operators and shell expansions
  • How to program with Bash: Loops

এই আর্টিকেল সিরিজটি আংশিকভাবে ডেভিড বথের তিন-খণ্ডের লিনাক্স সেলফ-স্টাডি কোর্স, Using and Administering Linux—Zero to SysAdmin-এর ভলিউম ২, অধ্যায় ১০-র ওপর ভিত্তি করে।

  1. Bash অটোমেশন স্ক্রিপ্ট দিয়ে ইমেজ অপ্টিমাইজেশন স্ট্রিমলাইন করুন

  2. লিনাক্সে স্টারগেজিংয়ের সময় রাত্রি দৃষ্টি রক্ষার জন্য ব্যাশ স্ক্রিপ্ট

  3. লিনাক্সে বাশ স্ক্রিপ্ট সিকিউর করুন: SHC দিয়ে সেনসিটিভ ডেটা এনক্রিপ্ট করুন

  4. আপনার পিসি থেকে অনিচ্ছাকৃত প্রোগ্রাম সহজে মুছে ফেলুন: ধাপে ধাপে গাইড