শেল স্ক্রিপ্টিং লিনাক্সে প্রক্রিয়া অটোমেশনের একটি গুরুত্বপূর্ণ অংশ। স্ক্রিপ্টিং আপনাকে একটি ফাইলে কমান্ডের একটি শৃঙ্খলা লিখে তারপর সেগুলো এক্সিকিউট করতে সাহায্য করে।
এটি আপনার সময় বাঁচায় কারণ আপনাকে একই কমান্ডগুলো বারবার লিখতে হয় না। আপনি দৈনন্দিন কাজগুলো দক্ষতার সাথে সম্পন্ন করতে পারেন এবং সেগুলো স্বচালিত এক্সিকিউশনের জন্য শিডিউলও করতে পারেন।
আপনি কিছু স্ক্রিপ্ট স্টার্টআপে এক্সিকিউট হওয়ার জন্য সেট করতে পারেন, যেমন- নতুন সেশন চালু হলে একটি নির্দিষ্ট বার্তা দেখানো বা নির্দিষ্ট এনভায়রনমেন্ট ভেরিয়েবল সেট করা।
স্ক্রিপ্টিংয়ের অ্যাপ্লিকেশন ও ব্যবহার অসংখ্য, তাই আসুন গভীরে যাই।
এই আর্টিকেলে আপনি শিখবেন:
- ব্যাশ শেল কী?
- ব্যাশ স্ক্রিপ্ট কী এবং সেটি কিভাবে চিনবেন?
- আপনার প্রথম ব্যাশ স্ক্রিপ্ট কিভাবে তৈরি ও এক্সিকিউট করবেন।
- শেল স্ক্রিপ্টিংয়ের বেসিক সিনট্যাক্স।
- সিস্টেমের শিডিউলড স্ক্রিপ্টগুলো কিভাবে দেখবেন।
- ক্রন জবস দিয়ে স্ক্রিপ্ট শিডিউল করে অটোমেট করার পদ্ধতি।
শিখতে সবচেয়ে ভালো উপায় হলো প্র্যাকটিস করা। আমি আপনাকে রিপ্লিট (Replit) ব্যবহার করে ফলো করার পরামর্শ দিচ্ছি। সেখানে মিনিটের মধ্যে একটি রানিং লিনাক্স শেল পাওয়া যায়।
ব্যাশ শেলের পরিচিতি
লিনাক্স কমান্ড লাইনটি একটি প্রোগ্রাম দ্বারা প্রদান করা হয় যাকে শেল বলা হয়। বছরের পর বছর শেল প্রোগ্রামটি বিভিন্ন অপশনের জন্য উন্নত হয়েছে।
বিভিন্ন ইউজাররা ভিন্ন শেল ব্যবহার করতে কনফিগার করা থাকতে পারে। কিন্তু অধিকাংশ ইউজার বর্তমান ডিফল্ট শেলটিই পছন্দ করেন। অনেক লিনাক্স ডিস্ট্রোর ডিফল্ট শেল হলো জিএনইউ Бор্ন-অগেইন শেল (bash)। ব্যাশ হলো Бор্ন শেল (sh)র সাকসেসর।
শেল প্রথম লঞ্চ হলে এটি .bashrc বা .bash_profile ফাইলে অবস্থিত একটি স্টার্টআপ স্ক্রিপ্ট ব্যবহার করে, যা আপনাকে শেলের আচরণ কাস্টমাইজ করতে দেয়।
যখন শেল ইন্টারঅ্যাক্টিভভাবে ব্যবহার করা হয়, তখন এটি ইউজারের কমান্ডের জন্য অপেক্ষামান অবস্থায় $ প্রদর্শন করে। এটাকে শেল প্রম্পট বলা হয়।
[username@host ~]$
যদি শেল রুট হিসেবে চলে, তবে প্রম্পটটি # এ পরিবর্তিত হয়। সুপারইউজার শেল প্রম্পট এরকম দেখায়:
[root@host ~]#
ব্যাশ খুব শক্তিশালী কারণ এটি কিছু অপারেশন সহজ করে দেয় যা GUI দিয়ে দক্ষতার সাথে করা কঠিন। মনে রাখবেন অধিকাংশ সার্ভারে GUI নেই, তাই কমান্ড লাইন ইন্টারফেস (CLI)র ক্ষমতা শিখা সেরা।
ব্যাশ স্ক্রিপ্ট কী?
একটি ব্যাশ স্ক্রিপ্ট হলো একটি ফাইলে লেখা কমান্ডের একটি সিরিজ। এগুলো ব্যাশ প্রোগ্রাম দ্বারা পড়া ও এক্সিকিউট হয়। প্রোগ্রামটি লাইন বাই লাইন এক্সিকিউট করে।
উদাহরণস্বরূপ, আপনি কমান্ড লাইন দিয়ে একটি নির্দিষ্ট পাথে নেভিগেট করতে পারেন, একটি ফোল্ডার তৈরি করতে পারেন এবং তার ভেতরে একটি প্রসেস শুরু করতে পারেন।
আপনি একই ধাপের সিকোয়েন্সটি একটি ব্যাশ স্ক্রিপ্টে কমান্ডগুলো সংরক্ষণ করে রান করতে পারেন। স্ক্রিপ্টটি যেকোনো সংখ্যকবার চালানো যায়।
ব্যাশ স্ক্রিপ্ট কিভাবে চিনবেন?
.sh ফাইল এক্সটেনশন।
নেমিং কনভেনশন অনুযায়ী, ব্যাশ স্ক্রিপ্টের শেষে .sh থাকে। যাইহোক, sh এক্সটেনশন ছাড়াও ব্যাশ স্ক্রিপ্ট চমৎকারভাবে রান করতে পারে।
স্ক্রিপ্টগুলো ব্যাশ ব্যাং দিয়ে শুরু হয়।
স্ক্রিপ্টগুলো shebang দিয়েও চেনা যায়। Shebang হলো bash # এবং bang ! এর কম্বিনেশন যার পর/bash শেলের পথ থাকে। এটি স্ক্রিপ্টের প্রথম লাইন। Shebang শেলকে বলে যে এটিকে ব্যাশ শেল দিয়ে এক্সিকিউট করবে। Shebang সadece ব্যাশ ইন্টারপ্রেটারের এবসোলিউট পথ।
নিচে shebang স্টেটমেন্টের উদাহরণ দেওয়া হলো:
#! /bin/bashব্যাশ প্রোগ্রামের পথ ভিন্ন হতে পারে। পরে আমরা দেখব কিভাবে সেটি চিনতে হয়।
এক্সিকিউশন রাইটস
স্ক্রিপ্টগুলো এক্সিকিউট করার ইউজারের জন্য এক্সিকিউশন রাইট রাখে।
এক্সিকিউশন রাইট x দ্বারা প্রকাশ পায়। নিচের উদাহরণে, আমার ইউজারের ফাইল test_script.sh এর জন্য rwx (রিড, রাইট, এক্সিকিউট) রাইট আছে।

ফাইল কালার
এক্সিকিউটেবল স্ক্রিপ্ট বাকি ফাইল ও ফোল্ডার থেকে ভিন্ন রঙে দেখায়।
আমার কেসে, এক্সিকিউশন রাইটসহ স্ক্রিপ্টগুলো হরিনozem colour-এ দেখায়।

আপনার প্রথম ব্যাশ স্ক্রিপ্ট কিভাবে তৈরি করবেন
চলুন একটি সাধারণ স্ক্রিপ্ট তৈরি করি যা Hello World আউটপুট করবে।
hello_world.sh নামে একটি ফাইল তৈরি করুন
touch hello_world.shআপনার ব্যাশ শেলের পথ খুঁজুন।
which bash
আমার কেসে, পথটি হলো /usr/bin/bash এবং আমি এটি shebang-এ অন্তর্ভুক্ত করব।
কমান্ডটি লিখুন।
আমরা কনসোলে echo দিয়ে "hello world" প্রিন্ট করব।
আমাদের স্ক্রিপ্টটি এরকম দেখাবে:
#! usr/bin/bash echo "Hello World"আপনার পছন্দের টেক্সট এডিটর দিয়ে hello_world.sh ফাইলটি এডিট করুন এবং উপরের লাইনগুলো যোগ করুন।
আপনার ইউজারকে এক্সিকিউশন রাইট দিন।
ফাইল পারমিশন মডিফাই করে স্ক্রিপ্ট এক্সিকিউশন অনুমতি দিন নিচের কমান্ড দিয়ে:
chmod u+x hello_world.shchmod একটি ফাইলের বিদ্যমান রাইটস নির্দিষ্ট ইউজারের জন্য মডিফাই করে। আমরা ইউজার u এর জন্য +x যোগ করছি।
স্ক্রিপ্টটি রান করুন।
আপনি নিচের উপায়গুলোতে স্ক্রিপ্টটি রান করতে পারেন:
./hello_world.sh
bash hello_world.sh।
আউটপুটটি:

ব্যাশ স্ক্রিপ্টিংয়ের বেসিক সিনট্যাক্স
অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজের মতোই, ব্যাশ স্ক্রিপ্টিং কম্পিউটারের জন্য বোঝা যাবে এমন প্রোগ্রাম তৈরি করার জন্য কিছু নিয়ম মেনে চলে। এই সেকশনে আমরা ব্যাশ স্ক্রিপ্টিংয়ের সিনট্যাক্স শিখব।
ভেরিয়েবল ডিফাইন করার পদ্ধতি
আমরা variable_name=value সিনট্যাক্স দিয়ে ভেরিয়েবল ডিফাইন করতে পারি। ভেরিয়েবলের মান পেতে ভেরিয়েবলের আগে $ লাগাতে হয়।
#!/bin/bash # একটি সিম্পল ভেরিয়েবল উদাহরণ greeting=Hello name=Tux echo $greeting $name 
টাক্স (Tux) লিনাক্সের মাসকট পেঙ্গুইনের নামও।

আরিথমেটিক এক্সপ্রেশন
ব্যাশ গাণিতিক ক্যালকুলেশনের জন্য নিচের অপারেটরগুলো সাপোর্ট করে:
| অপারেটর | ব্যবহার |
|---|---|
| + | যোগ |
| - | বিয়োগ |
| * | গুণ |
| / | ভাগ |
| ** | ঘাত |
| % | মডুলাস |
কয়েকটা উদাহরণ রান করি।

নিউমেরিক্যাল এক্সপ্রেশন ক্যালকুলেট করে ভেরিয়েবলে স্টোর করা যায় নিচের সিনট্যাক্স দিয়ে:
var=$((expression))
একটা উদাহরণ চেষ্টা করি।
#!/bin/bash var=$((3+9)) echo $var 
উপরের মেথডগুলো দিয়ে ফ্র্যাকশন সঠিক ক্যালকুলেট হয় না এবং ট্রানকেট হয়ে যায়।
দশমিক ক্যালকুলেশনের জন্য, আমরা bc কমান্ড ব্যবহার করতে পারি আউটপুট নির্দিষ্ট দশমিক স্থান পর্যন্ত পেতে। bc (Bash Calculator) হলো একটি কমান্ড লাইন ক্যালকুলেটর যা নির্দিষ্ট দশমিক পয়েন্ট পর্যন্ত ক্যালকুলেশন সাপোর্ট করে।
echo "scale=2;22/7" | bc
এখানে scale আউটপুটে কতগুলো দশমিক স্থান থাকবে সেটি ডিফাইন করে।

ইউজার ইনপুট পড়ার পদ্ধতি
কখনো কখনো আপনাকে ইউজার ইনপুট নিয়ে প্রাসঙ্গিক অপারেশন করতে হয়।
ব্যাশে, আমরা read কমান্ড দিয়ে ইউজার ইনপুট নিতে পারি।
read variable_nameইউজারকে কাস্টম মেসেজ দিয়ে প্রম্পট করার জন্য -p ফ্ল্যাগ ব্যবহার করুন।
read -p "Enter your age" variable_name
উদাহরণ:
#!/bin/bash echo "Enter a numner" read a echo "Enter a numner" read b var=$((a+b)) echo $var 
নিউমেরিক কম্পোরিজন লজিক্যাল অপারেটর
কম্পোরিজন ব্যবহার করা হয় স্টেটমেন্টগুলো true নাকি false রিটার্ন করে কিনা চেক করতে। নিচের অপারেটরগুলো দিয়ে দুটি স্টেটমেন্ট কম্পোর করতে পারেন:
| অপারেশন | সিনট্যাক্স | ব্যাখ্যা |
|---|---|---|
| সমানতা | num1 -eq num2 | num1 কি num2 এর সমান? |
| একই বা বড় | num1 -ge num2 | num1 কি num2 এর থেকে বড় বা সমান? |
| বড় | num1 -gt num2 | num1 কি num2 এর থেকে বড়? |
| একই বা ছোট | num1 -le num2 | num1 কি num2 এর থেকে ছোট বা সমান? |
| ছোট | num1 -lt num2 | num1 কি num2 এর থেকে ছোট? |
| অসমান | num1 -ne num2 | num1 কি num2 এর সমান নয়? |
সিনট্যাক্স:
if [ conditions ] then commands fiউদাহরণ:
দুই সংখ্যা কম্পোর করে তাদের রিলেশন খুঁজে বের করি:
read x read y if [ $x -gt $y ] then echo X is greater than Y elif [ $x -lt $y ] then echo X is less than Y elif [ $x -eq $y ] then echo X is equal to Y fi আউটপুট:

কন্ডিশনাল স্টেটমেন্ট (ডিসিশন মেকিং)
কন্ডিশন হলো এক্সপ্রেশন যা বুলিয়ান এক্সপ্রেশন (true বা false) রিটার্ন করে। কন্ডিশন চেক করার জন্য আমরা if, if-else, if-elif-else এবং নেস্টেড কন্ডিশনাল ব্যবহার করতে পারি।
কন্ডিশনাল স্টেটমেন্টের কাঠামো নিচেররকম:
if...then...fiস্টেটমেন্টif...then...else...fiস্টেটমেন্টif..elif..else..fiif..then..else..if..then..fi..fi..(নেস্টেড কন্ডিশনাল)
সিনট্যাক্স:
if [[ condition ]] then statement elif [[ condition ]]; then statement else do this by default fiঅর্থপূর্ণ কম্পোরিজন তৈরি করতে আমরা AND -a এবং OR -o ব্যবহার করতে পারি।
নিচের স্টেটমেন্টের অর্থ: যদি a 40 এর চেয়ে বড় হয় এবং b 6 এর চেয়ে ছোট হয়।
if [ $a -gt 40 -a $b -lt 6 ]
উদাহরণ: ত্রিভুজের বাহুগুলোর দৈর্ঘ্য পড়ে তার টাইপ খুঁজে বের করি।
read a read b read c if [ $a == $b -a $b == $c -a $a == $c ] then echo EQUILATERAL elif [ $a == $b -o $b == $c -o $a == $c ] then echo ISOSCELES else echo SCALENE fiআউটপুট:
টেস্ট কেস #১

টেস্ট কেস #২

টেস্ট কেস #৩

লুপিং ও স্কিপিং
ফর লুপ আপনাকে নির্দিষ্ট সংখ্যকবার স্টেটমেন্ট এক্সিকিউট করতে দেয়।
সংখ্যা দিয়ে লুপিং:
নিচের উদাহরণে, লুপটি ৫ বার ইটারেট হবে।
#!/bin/bash for i in {1..5} do echo $i done
স্ট্রিং দিয়ে লুপিং:
আমরা স্ট্রিং দিয়েও লুপ করতে পারি।
#!/bin/bash for X in cyan magenta yellow do echo $X done
হওয়াইল লুপ
হওয়াইল লুপ একটি কন্ডিশন চেক করে এবং কন্ডিশন true থাকা পর্যন্ত লুপ চলে। লুপ এক্সিকিউশন কন্ট্রোল করার জন্য একটি কাউন্টার স্টেটমেন্ট দিতে হয় যা কাউন্টারকে ইনক্রিমেন্ট করে।
নিচের উদাহরণে, (( i += 1 )) হলো কাউন্টার স্টেটমেন্ট যা i-র মান বাড়ায়।
উদাহরণ:
#!/bin/bash i=1 while [[ $i -le 10 ]] ; do echo "$i" (( i += 1 )) done 
ফাইল পড়া
ধরুন আমাদের একটি ফাইল আছে sample_file.txt নিচের মতঃ

আমরা ফাইলটি লাইন বাই লাইন পড়ে আউটপুট স্ক্রিনে প্রিন্ট করতে পারি।
#!/bin/bash LINE=1 while read -r CURRENT_LINE do echo "$LINE: $CURRENT_LINE" ((LINE++)) done < "sample_file.txt"আউটপুট:

ব্যাকটিক্স দিয়ে কমান্ড এক্সিকিউট করা
আপনার স্ক্রিপ্টে একটি জটিল কমান্ডের আউটপুট অন্তর্ভুক্ত করতে হলে, আপনি স্টেটমেন্টটি ব্যাকটিক্সের ভেতরে লিখতে পারেন।
সিনট্যাক্স:
var= ` commands `
উদাহরণ: ধরা যাক আমরা tmpfs নেমवाले মাউন্টপয়েন্টের লিস্ট পেতে চাই। আমরা এমন স্টেটমেন্ট লিখতে পারি: df -h | grep tmpfs।
ব্যাশ স্ক্রিপ্টে এটি অন্তর্ভুক্ত করতে ব্যাকটিক্সে আড়াল করুন।
#!/bin/bash var=`df -h | grep tmpfs` echo $varআউটপুট:

কমান্ড লাইন থেকে স্ক্রিপ্টের আর্গুমেন্ট নেওয়া
স্ক্রিপ্ট এক্সিকিউশনের সময় আর্গুমেন্ট দেওয়া যায়।
$@ প্যারামিটারগুলোর পজিশন রিপ্রেজেন্ট করে, এক থেকে শুরু হয়।
#!/bin/bash for x in $@ do echo "Entered arg is $x" doneএভাবে রান করুন:
./script arg1 arg2

ক্রন জবস দিয়ে শিডিউল করে স্ক্রিপ্ট অটোমেট করা
ক্রন ইউনিক্স-লাইক সিস্টেমে একটি জব শিডিউলিং ইউটিলিটি। আপনি দৈনিক, সাপ্তাহিক, মাসিক বা দিনের নির্দিষ্ট সময়ে জব এক্সিকিউট করতে শিডিউল করতে পারেন। লিনাক্সে অটোমেশন 크게 কрон জবসের ওপর নির্ভর করে।
ক্রন শিডিউল করার সিনট্যাক্স নিচে:
# Cron job example * * * * * sh /path/to/script.shএখানে, * মিনিট, আওয়ার, ডে, মানথ, উইকডে রিপ্রেজেন্ট করে।
ক্রন জব শিডিউলিংয়ের কিছু উদাহরণ:
| শিডিউল | শিডিউলড ভ্যালু |
|---|---|
| 5 0 * 8 * | আগস্ট মাসে ০০:০৫ बजে। |
| 5 4 * * 6 | রবিবার ০৪:০৫ बजে। |
| 0 22 * * 1-5 | সোমবার থেকে শুক্রবার প্রতিদিন ২২:০০ बजে। |
ক্রন সম্পর্কে বিস্তারিত জানতে এই ব্লগ পোস্ট পড়ুন।
সিস্টেমে বিদ্যমান স্ক্রিপ্টগুলো কিভাবে চেক করবেন
crontab ব্যবহার করে
crontab -l নির্দিষ্ট ইউজারের জন্য ইতিমধ্যে শিডিউল করা স্ক্রিপ্টগুলো লিস্ট করে।

find কমান্ড ব্যবহার করে
find কমান্ড নির্দিষ্ট প্যাটার্নের ওপর ভিত্তি করে ফাইল খুঁজে বের করতে সাহায্য করে। যেহেতু অধিকাংশ স্ক্রিপ্ট .sh দিয়ে শেষ হয়, আমরা ফাইন্ড কমান্ড چنین ব্যবহার করতে পারি:
find . -type f -name "*.sh"এখানে,
.বর্তমান ডিরেক্টরি রিপ্রেজেন্ট করে। আপনি পথ পরিবর্তন করতে পারেন।-type fইন্ডিকেট করে যে আমরা টেক্সট-বেসড ফাইল খুঁজছি।*.shবলে.shদিয়ে শেষ হওয়া সকল ফাইল ম্যাচ করতে।

আপনি যদি find কমান্ড সম্পর্কে বিস্তারিত জানতে চান, আমার অন্য পোস্টটি চেক করুন।
শেষ কথা
এই টিউটোরিয়ালে আমরা শেল স্ক্রিপ্টিংয়ের বেসিক শিখলাম। আমরা উদাহরণ ও সিনট্যাক্স দেখলাম যা আমাদের অর্থপূর্ণ প্রোগ্রাম লেখতে সাহায্য করবে।
এই টিউটোরিয়াল থেকে আপনার ফেভারিট কী শিখলেন? টুইটারে জানান!
আমার অন্যান্য পোস্টগুলো এখানে পড়ুন।
Work vector created by macrovector - www.freepik.com