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

আপনার ব্যাশ স্ক্রিপ্টে একটি শক্তিশালী হেল্প সিস্টেম যোগ করুন

এই সিরিজের প্রথম আর্টিকেলে, আপনি একটি খুব ছোট, এক-লাইনের ব্যাশ স্ক্রিপ্ট তৈরি করেছিলেন এবং শেল স্ক্রিপ্ট তৈরি করার কারণগুলো এক্সপ্লোর করেছিলেন এবং কেন সেগুলো কম্পাইলড প্রোগ্রামের চেয়ে সিস্টেম অ্যাডমিনের জন্য সবচেয়ে এফিশিয়েন্ট অপশন সেটি। দ্বিতীয় আর্টিকেলে, আপনি একটি نسبتন সিম্পল টেমপ্লেট তৈরি করার কাজ শুরু করেছিলেন যা আপনি অন্যান্য ব্যাশ প্রোগ্রামের জন্য একটি শুরুর বিন্দু হিসেবে ব্যবহার করতে পারেন, তারপর সেটি টেস্ট করার উপায় এক্সপ্লোর করেছিলেন।

এই সিরিজের চারটি আর্টিকেলের এই তৃতীয়টি ব্যাখ্যা করে কীভাবে একটি সহজ Help ফাংশন তৈরি এবং ব্যবহার করতে হয়। আপনার Help ফ্যাসিলিটি তৈরি করার সময়, আপনি ফাংশন ব্যবহার এবং কমান্ড-লাইন অপশন যেমন -h হ্যান্ডেল করার বিষয়েও শিখবেন।

কেন Help?

খুব সহজ ব্যাশ প্রোগ্রামগুলোর ওপরও কিছু soort Help ফ্যাসিলিটি থাকা উচিত, যদিও সেটি খুব sơরূপ হয়। আমার লেখা অনেক ব্যাশ শেল প্রোগ্রাম এমনভাবে কম ব্যবহার হয় যে আমি কমান্ডের একজ্যাক্ট সিনট্যাক্স ভুলে যাই যেটি আমার প্রয়োজন। অন্যগুলো এতটাই কমপ্লেক্স যে আমি সেসব ব্যবহার করলেও অপশন এবং আর্গুমেন্ট রিভিউ করতে হয়।

একটি বিল্ট-ইন Help ফাংশন থাকলে আপনি কোড নিজে ইনস펙্ট না করেই সেসব জিনিস দেখতে পারেন। একটি ভালো এবং কমপ্লিট Help ফ্যাসিলিটি প্রোগ্রাম ডকুমেন্টেশনেরও অংশ।

ফাংশন সম্পর্কে

শেল ফাংশনগুলো হল ব্যাশ প্রোগ্রাম স্টেটমেন্টের তালিকা যা শেলের এনভায়রনমেন্টে সংরক্ষিত থাকে এবং যেকোনো অন্য কমান্ডের মতো, কমান্ড লাইনে তাদের নাম টাইপ করে এক্সিকিউট করা যায়। শেল ফাংশনকে প্রসিজার বা সাবরুটিনও বলা হয়, নির্ভর করে আপনি কোন প্রোগ্রামিং ভাষা ব্যবহার করছেন।

ফাংশনগুলো স্ক্রিপ্টে বা কমান্ড-লাইন ইন্টারফেস (সিএলআই) থেকে তাদের নাম ব্যবহার করে কল করা হয়, ঠিক যেকোনো অন্য কমান্ডের মতো। একটি সিএলআই প্রোগ্রাম বা স্ক্রিপ্টে, ফাংশনindeki কমান্ডগুলো এক্সিকিউট হয় যখন সেগুলো কল করা হয়, তারপর প্রোগ্রাম ফ্লো সিকোয়েন্স কলিং এন্টিটির কাছে ফিরে যায়, এবং সেই এন্টিটির পরবর্তী সিরিজ প্রোগ্রাম স্টেটমেন্ট এক্সিকিউট হয়।

একটি ফাংশনের সিনট্যাক্স হল:

FunctionName(){program statements}

এটি এক্সপ্লোর করুন একটি সহজ ফাংশন সিএলআই-তে তৈরি করে। (ফাংশনটি শেল এনভায়রনমেন্টে সেট থাকে শেল ইনস্ট্যান্সের জন্য যেটিতে এটি তৈরি করা হয়।) আপনি একটি ফাংশন তৈরি করবেন যেটি hw নামে, যা "hello world"-এর জন্য স্ট্যান্ড করে। নিচের কোডটি সিএলআই-তে লিখুন এবং Enter দিন। তারপর hw লিখুন যেন যেকোনো অন্য শেল কমান্ড:

[student@testvm1 ~]$ hw(){ echo "Hi there kiddo"; }
[student@testvm1 ~]$ hw
Hi there kiddo
[student@testvm1 ~]$

ঠিক আছে, আমি স্ট্যান্ডার্ড "Hello world" স্টার্টার থেকে একটু বিরক্ত হয়ে গেছি। এখন বর্তমানে ডিফাইন করা সকল ফাংশন লিস্ট করুন। অনেক সारा আছে, তাই আমি শুধু নতুন hw ফাংশনটি দেখাচ্ছি। যখন এটি কমান্ড লাইন থেকে বা একটি প্রোগ্রামের মধ্যে কল করা হয়, একটি ফাংশন তার প্রোগ্রামড টাস্ক পারফর্ম করে এবং তারপর এক্সিট করে এবং কন্ট্রোল ফেরত দেয় কলিং এন্টিটির কাছে, কমান্ড লাইন, বা একটি স্ক্রিপ্টে কলিং স্টেটমেন্টের পরের নেক্সট সিরিজ ব্যাশ প্রোগ্রাম স্টেটমেন্ট:

[student@testvm1 ~]$ declare -f | less
<snip>
hw ()
{
echo "Hi there kiddo"
}
<snip>

সেটি রিমুভ করুন কারণ আপনাকে আর দরকার নেই। আপনি এটা unset কমান্ড দিয়ে করতে পারেন:

[student@testvm1 ~]$ unset -f hw ; hw
bash: hw: command not found
[student@testvm1 ~]$

Help ফাংশন তৈরি করা

hello প্রোগ্রামটি একটি এডিটরে খুলুন এবং নিচের Help ফাংশনটি hello প্রোগ্রাম কোডে কপিরাইট স্টেটমেন্টের পরে কিন্তু echo "Hello world!" স্টেটমেন্টের আগে যোগ করুন। এই Help ফাংশনটি প্রোগ্রামের একটি সংক্ষিপ্ত বিবরণ, একটি সিনট্যাক্স ডায়াগ্রাম, এবং উপলব্ধ অপশনগুলোর সংক্ষিপ্ত বিবরণ প্রদর্শন করবে। Help ফাংশন কল করার একটি কল যোগ করুন এটি টেস্ট করার জন্য এবং কিছু কমেন্ট লাইন যোগ করুন যা ফাংশন এবং প্রোগ্রামের মূল অংশের মধ্যে একটি ভিজ্যুয়াল ডিমার্কেশন প্রদান করে:

################################################################################
# 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
}

################################################################################
################################################################################
# Main program #
################################################################################
################################################################################

Help
echo "Hello world!"

প্রোগ্রামটি রান করুন টেস্ট করার জন্য:

[student@testvm1 ~]$ ./hello
Add description of the script functions here.

Syntax: scriptTemplate [-g|h|v|V]
options:
g Print the GPL license notification.
h Print this Help.
v Verbose mode.
V Print software version and exit.

Hello world!
[student@testvm1 ~]$

কারণ আপনি Help শুধু তখন দেখানোর জন্য কোনো লজিক যোগ করেননি, প্রোগ্রামটি সবসময় Help ডিসপ্লে করবে। যেহেতু ফাংশনটি সঠিকভাবে কাজ করছে, পড়তে থাকুন কিছু লজিক যোগ করার জন্য যাতে Help শুধু তখন ডিসপ্লে হয় যখন আপনি প্রোগ্রামটি কমান্ড লাইনে ইনভোক করার সময় -h অপশন ব্যবহার করেন।

অপশন হ্যান্ডলিং

একটি ব্যাশ স্ক্রিপ্টের কমান্ড-লাইন অপশন যেমন -h হ্যান্ডেল করার ক্ষমতা প্রোগ্রামকে নির্দেশ দেয়া এবং সেটি কী করে সেটি মডিফাই করার কিছু শক্তিশালী ক্যাপাবিলিটি দেয়। -h অপশনের ক্ষেত্রে, আপনি চান প্রোগ্রামটি Help টেক্সট টার্মিনাল সেশনে প্রিন্ট করে এবং তারপর বাকি প্রোগ্রাম রান না করে কিয়েট করুক। কমান্ড লাইনে লিখা অপশন প্রসেস করার ক্ষমতা ব্যাশ স্ক্রিপ্টে while কমান্ড (দেখুন How to program with Bash: Loops while সম্পর্কে আরও জানতে) getops এবং case কমান্ডের সাথে কনজাঙ্কশনে যোগ করা যায়।

getops কমান্ড কমান্ড লাইনে স্পেসিফাই করা যেকোনো এবং সকল অপশন পড়ে এবং সেসব অপশনের একটি তালিকা তৈরি করে। নিচের কোডে, while কমান্ড অপশন তালিকার মাধ্যমে লুপ করে $options ভেরিয়েবল সেট করে প্রতিটি জন্য। case স্টেটমেন্ট প্রতিটি অপশন করমে ইভ্যালুয়েট করতে এবং সংশ্লিষ্ট স্টানজায় স্টেটমেন্ট এক্সিকিউট করতে ব্যবহার হয়। while স্টেটমেন্ট অপশন তালিকা ইভ্যালুয়েট করতে থাকবে যতক্ষণ না সেগুলো প্রসেস হয়ে যায় বা এটি একটি exit স্টেটমেন্ট এনকাউন্টার করে, যা প্রোগ্রামটি টার্মিনেট করে।

নিশ্চিত করুন যে আপনি echo "Hello world!" স্টেটমেন্টের ঠিক আগে Help ফাংশন কলটি ডিলিট করেছেন যেন প্রোগ্রামের মেইন বডি এখন এরকম দেখে:

################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# Process the input options. Add options as needed. #
################################################################################
# Get the options
while getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
esac
done

echo "Hello world!"

case অপশন -h-এ exit স্টেটমেন্টের শেষে ডাবল সেমিকোলন লক্ষ্য করুন। এটি এই case স্টেটমেন্টে যোগ করা প্রতিটি অপশনের জন্য রিকোয়ার্ড যেন প্রতিটি অপশনের এন্ড ডিলাইনিট করা যায়।

টেস্টিং

টেস্টিং এখন কিছুটা বেশি কমপ্লেক্স। আপনাকে আপনার প্রোগ্রামটি অনেক ভিন্ন অপশন দিয়ে—এবং কোনো অপশন ছাড়া—টেস্ট করতে হবে যেন দেখতে পান সেটি কীভাবে রেসপন্ড করে। প্রথম, কোনো অপশন ছাড়া টেস্ট করুন যেন নিশ্চিত হয় সেটি "Hello world!" প্রিন্ট করছে যেমন করা উচিত:

[student@testvm1 ~]$ ./hello
Hello world!

এটা কাজ করলো, তাহলে এখন লজিকটি টেস্ট করুন যা Help টেক্সট ডিসপ্লে করে:

[student@testvm1 ~]$ ./hello -h
Add description of the script functions here.

Syntax: scriptTemplate [-g|h|t|v|V]
options:
g Print the GPL license notification.
h Print this Help.
v Verbose mode.
V Print software version and exit.

এটা এক্সপেক্টেডভাবে কাজ করলো, তাহলে কিছু টেস্ট করুন যেন দেখতে পান অপ্রত্যাশিত অপশন দিলে কী হয়:

[student@testvm1 ~]$ ./hello -x
Hello world!
[student@testvm1 ~]$ ./hello -q
Hello world!
[student@testvm1 ~]$ ./hello -lkjsahdf
Add description of the script functions here.

Syntax: scriptTemplate [-g|h|t|v|V]
options:
g Print the GPL license notification.
h Print this Help.
v Verbose mode.
V Print software version and exit.

[student@testvm1 ~]$

প্রোগ্রামটি কোনো স্পেসিফিক রেসপন্স ছাড়া যেসব অপশন ইগনোর করে কোনো এরর জেনারেট না করে। কিন্তু লাস্ট এন্ট্রিটি লক্ষ্য করুন (যেখানে অপশন হিসেবে -lkjsahdf): কারণ অপশন তালিকাতে একটি h আছে, প্রোগ্রামটি সেটি রিকগ্নাইজ করলো এবং Help টেক্সট প্রিন্ট করলো। এই টেস্টিং দেখিয়েছে যে প্রোগ্রামটিতে ইনকরেক্ট ইনপুট হ্যান্ডেল করে প্রোগ্রাম টার্মিনেট করার ক্ষমতা নেই।

আপনি case স্টেটমেন্টে অন্য একটি case stanza যোগ করতে পারেন যেকোনো অপশন ম্যাচ করার জন্য যেটির এক্সপ্লিসিট ম্যাচ নেই। এই জেনেরেল case যেকোনো কিছু ম্যাচ করবে যেটির জন্য আপনি স্পেসিফিক ম্যাচ দেননি। case স্টেটমেন্ট এখন এরকম দেখবে, \? ক্যাচ-অল ম্যাচটি লাস্ট case হিসেবে। যেকোনো অ্যাডিশনাল স্পেসিফিক case এই ফাইনালটির আগে হতে হবে:

while getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
\?) # incorrect option
echo "Error: Invalid option"
exit;;
esac
done

প্রোগ্রামটি আবার একই অপশন দিয়ে টেস্ট করুন এবং দেখুন এখন কীভাবে কাজ করে।

আপনি আছেন কোথায়

আপনি এই আর্টিকেলে ভালো অমাউন্ট অর্জন করেছেন কমান্ড-লাইন অপশন প্রসেস করার ক্যাপাবিলিটি এবং একটি Help প্রসিজার যোগ করে। আপনার ব্যাশ স্ক্রিপ্ট এখন এরকম দেখে:

#!/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|t|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
}

################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# 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 "Hello world!"

নিশ্চিত করুন এই ভার্সন প্রোগ্রামটি খুব থারো টেস্ট করেন। র‍্যান্ডম ইনপুট ব্যবহার করুন এবং দেখুন কী হয়। আপনাকে বেলিড এবং ইনভ্যালিড অপশন ড্যাশ (-) ছাড়া টেস্ট করার চেষ্টা করনিও উচিত।

পরবর্তী বার

এই আর্টিকেলে, আপনি একটি 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. Zoom-কে Outlook-এ নিখুঁতভাবে ইন্টিগ্রেট করুন सहজ মিটিং-এর জন্য

  2. আধুনিক Windows PC-এ Windows Sidebar রিস্টোর করুন: ধাপে ধাপে গাইড

  3. ম্যাক স্টার্টআপে অ্যাপস ও ডকুমেন্ট যোগ করুন: সিমলেস লগইন পান

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