শেল স্ক্রিপ্ট তৈরি করা লিনাক্স ইউজারদের হাতের মুঠোয় থাকা সবচেয়ে এসেনশিয়াল স্কিলগুলির এক। শেল স্ক্রিপ্ট পুনরাবৃত্ত টাস্ক অটোমেট করতে বিশাল ভূমিকা পালন করে যা অন্যথায় লাইন বাই লাইন এক্সিকিউট করা খুব ক্লান্তিকর হতো।
এই টিউটোরিয়ালে, আমরা কিছু বেসিক শেল স্ক্রিপ্টিং অপারেশন হাইলাইট করব যা প্রতিটি লিনাক্স ইউজারের জানা উচিত।
১. একটি সিম্পল শেল স্ক্রিপ্ট তৈরি করুন
একটি শেল স্ক্রিপ্ট হলো একটি ফাইল যেটি ASCII টেক্সট নিয়ে গঠিত। আমরা একটি সিম্পল শেল স্ক্রিপ্ট তৈরি করে শুরু করব, এবং এর জন্য একটি টেক্সট এডিটর ব্যবহার করব। কমান্ড-লাইন এবং GUI-ভিত্তিক অনেক টেক্সট এডিটর আছে। এই গাইডে আমরা vim এডিটর ব্যবহার করব।
আমরা একটি সিম্পল স্ক্রিপ্ট তৈরি করব যা এক্সিকিউট করলে “Hello world” ডিসপ্লে করবে।
$ vim hello.sh
নিচের কন্টেন্ট ফাইলে পেস্ট করুন এবং সেভ করুন।
#!/bin/bash # Print Hello world message echo "Hello World!"
শেল স্ক্রিপ্টটি লাইন বাই লাইন যাই পড়ি:
- প্রথম লাইন –
#!/bin/bash– হলো shebang হেডার। এটি একটি স্পেশাল কনস্ট্রাক্ট যা ইন্ডিকেট করে কোন প্রোগ্রাম স্ক্রিপ্ট ইন্টারপ্রেট করতে ব্যবহার হবে। এই কেসে, এটি হবে bash শেল যাকে /bin/bash ইন্ডিকেট করে। অন্যান্য স্ক্রিপ্টিং ল্যাঙ্গুয়েজ যেমন Python যাকে#!/usr/bin/python3দিয়ে ডেনোট করা হয় এবং Perl যের shebang হেডার#!/usr/bin/perlদিয়ে ডেনোট করা হয়। - দ্বিতীয় লাইন একটি কমেন্ট। কমেন্ট হলো একটি স্টেটমেন্ট যা ডিসক্রাইব করে শেল স্ক্রিপ্ট কী করে এবং স্ক্রিপ্ট রান করলে এক্সিকিউট হয় না। কমেন্ট সবসময় হ্যাশ সাইন
#- দিয়ে প্রসিড করা হয়। - শেষ লাইন হলো কমান্ড যা টার্মিনালে ‘Hello World’ মেসেজ প্রিন্ট করে।
পরবর্তী ধাপ হলো chmod কমান্ড ব্যবহার করে এক্সিকিউট পারমিশন অ্যাসাইন করে স্ক্রিপ্টকে এক্সিকিউটেবল বানানো।
$ chmod +x hello.sh
অবশেষে, নিচের যেকোনো একটি কমান্ড দিয়ে শেল স্ক্রিপ্ট রান করুন:
$ bash hello.sh OR $ ./hello.sh
২. কোড এক্সিকিউট করতে কন্ডিশনাল স্টেটমেন্ট ব্যবহার করুন
অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজের মতো, conditional statements bash স্ক্রিপ্টিং-এ ডিসিশন মেকিং-এ ব্যবহৃত হয়, শুধু সিনট্যাক্সে সামান্য ভিন্নতা আছে। আমরা if, if-else, এবং elif কন্ডিশনাল স্টেটমেন্ট কভার করব।
শুধু if স্টেটমেন্ট উদাহরণ
if স্টেটমেন্ট ব্যবহার করা যায় সিঙ্গল বা মাল্টিপল কন্ডিশন টেস্ট করতে। আমরা if স্টেটমেন্টের ফান্ডামেন্টাল ব্যবহার শুরু করব সিঙ্গল কন্ডিশন টেস্ট করতে। if স্টেটমেন্ট if ... fi ব্লক দিয়ে ডিফাইন করা হয়।
if command then statement fi
নিচের শেল স্ক্রিপ্টটি দেখুন।
#!/bin/bash echo 'Enter the score' read x if [[ $x == 70 ]]; then echo 'Good job!' fi
উপরের শেল স্ক্রিপ্ট ইউজারকে স্কোর প্রদান করতে প্রম্পট করে যা ভেরিয়েবল x-এ স্টোর হয়। যদি স্কোর 70-এর সাথে মিলে যায়, স্ক্রিপ্ট আউটপুট দেবে “Good job!”। কমপারিজন অপারেটর == ব্যবহার করা হয়েছে চেক করতে যে ইনপুট স্কোর যেটি ভেরিয়েবল x-এ স্টোর হয়েছে, সেটি 100-এর সমতুল্য কিনা।
অন্য কমপারিজন অপারেটর যা আপনি ব্যবহার করতে পারেন:
-eq– Equal to-ne– Not equal to-lt– Less than-le– Less than or equal to-lt– Less than (ডুপ্লিকেট)-ge– Greater than or equal to
উদাহরণস্বরূপ, নিচের if-statement ব্লক ‘Work Harder’ প্রিন্ট করবে যদি ইনপুট স্কোর 50-এর চেয়ে কম যেকোনো ভ্যালু হয়।
if [[ $x -lt 50 ]]; then echo 'Work Harder!' fi
if-else স্টেটমেন্ট উদাহরণ
দুটি সম্ভাব্য আউটকামের সিচুয়েশনে: – এই না সে – if-else স্টেটমেন্ট কাজে আসে।
if command then statement1 else statement2 fi
নিচের স্ক্রিপ্ট ইনপুট স্কোর পড়ে এবং চেক করে যে সেটি 70-এর চেয়ে বড় বা সমান কিনা।
যদি স্কোর 70-এর চেয়ে বড় বা সমান হয়, আপনি পাবেন ‘Great job, You passed!’ মেসেজ। তবে, যদি স্কোর 70-এর নিচে পড়ে, আউটপুট ‘You failed’ প্রিন্ট হবে।
#!/bin/bash echo 'Enter the score' read x if [[ $x -ge 70 ]]; then echo 'Great job, You passed!' else echo 'You failed' fi
if-elif-else স্টেটমেন্ট উদাহরণ
একাধিক কন্ডিশন এবং ভিন্ন আউটকামের সিনেরিওতে, if-elif-else স্টেটমেন্ট ব্যবহৃত হয়। এই স্টেটমেন্ট নিচের ফরম্যাট নেয়।
if condition1 then statement1 elif condition2 then statement2 else statement3 fi
উদাহরণস্বরূপ, আমাদের একটি লটারি স্ক্রিপ্ট আছে যা চেক করে ইনপুট নম্বর 90, 60 বা 30 কিনা।
#!/bin/bash echo 'Enter the score' read x if [[ $x -eq 90 ]]; then echo “You have won the First Prize” elif [[ $x -eq 60 ]]; then echo “You have won the Second Prize” elif [[ $x -eq 30 ]]; then echo “You have won the Second Prize” else echo “Please try again” fi
৩. AND লজিক সহ If স্টেটমেন্ট ব্যবহার
আপনি if স্টেটমেন্ট AND লজিক অপারেটরসহ ব্যবহার করতে পারেন একটি টাস্ক এক্সিকিউট করতে যদি দুটি কন্ডিশন স্যাটিসফাই হয়। && অপারেটর AND লজিক ডেনোট করে।
#!/bin/bash echo 'Please Enter your user_id' read user_id echo 'Please Enter your tag_no' read tag_id if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]]; then echo “Login successful” else echo “Login failure” fi
৫. OR লজিক সহ If স্টেটমেন্ট ব্যবহার
OR লজিক ব্যবহার করলে, যেটি || সিম্বল দিয়ে রিপ্রেজেন্ট করা হয়, দুটি কন্ডিশন যেকোনো একটি স্যাটিসফাই হলে স্ক্রিপ্ট এক্সপেক্টেড রেজাল্ট দেবে।
#!/bin/bash echo 'Please enter a random number' read number if [[ (number -eq 55 || number -eq 80) ]]; then echo 'Congratulations! You’ve won' else echo 'Sorry, try again' fi
লুপিং কনস্ট্রাক্ট ব্যবহার করুন
Bash loops ইউজারদের একটি সিরিজ টাস্ক পেরফর্ম করতে দেয় যতক্ষণ না একটি নির্দিষ্ট রেজাল্ট অর্জিত হয়। এটি পুনরাবৃত্ত টাস্ক পেরফর্ম করতে খুব handy। এই সেকশনে, আমরা কিছু লুপের ওভারভিউ দেখব যা আপনি অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজেও পাবেন।
While loop
এটি কাজ করার সবচেয়ে সহজ লুপগুলির এক। সিনট্যাক্স খুব সিম্পল:
whiledo commands done
নিচের while loop এক্সিকিউট করলে ১ থেকে ১০ পর্যন্ত সব নম্বর লিস্ট করবে।
#!/bin/bash # A simple while loop counter=1 while [ $counter -le 10 ] do echo $counter ((counter++)) done
While loop আলোচনা করি:
ভেরিয়েবল counter 1-এ ইনিশিয়ালাইজ করা হয়েছে। এবং যতক্ষণ ভেরিয়েবল 10-এর চেয়ে কম বা সমান, কাউন্টারের ভ্যালু ইনক্রিমেন্ট হবে যতক্ষণ না কন্ডিশন স্যাটিসফাই হয়। লাইন echo $counter ১ থেকে ১০ পর্যন্ত সব নম্বর প্রিন্ট করে।
For loop
While loop-এর মতো, for loop কোড ইটারেটিভলি এক্সিকিউট করতে ব্যবহৃত হয়। অর্থাৎ ইউজার ডিফাইন্ড মতো যতবার সম্ভব কোড এক্সিকিউশন রিপিট করা।
সিনট্যাক্স হলো:
for var in 1 2 3 4 5 N do command1 command2 done
নিচের for loop ১ থেকে ১০ পর্যন্ত ইটারেট করে এবং তাদের ভ্যালু স্ক্রিনে প্রসেস করে।
এটি অর্জন করার একটি बेटার উপায় হলো ডাবল কার্লি ব্রেস { } ব্যবহার করে রেঞ্জ ডিফাইন করা যেমন নিচে দেখানো হলো বরং সব নম্বর টাইপ করার পরিবর্তে।
#!/bin/bash
# Specify range in a for loop
for num in {1..10}
do
echo $num
done
Bash পজিশনাল প্যারামিটার
একটি পজিশনাল প্যারামিটার হলো একটি স্পেশাল ভেরিয়েবল যা স্ক্রিপ্টে রেফারেন্স করা হয় যখন ভ্যালু শেলে পাস করা হয় কিন্তু অ্যাসাইন করা যাবে না। পজিশনাল প্যারামিটার $0 $1 $2 $3 … থেকে $9 পর্যন্ত চলে। $9-এর বাইরে, প্যারামিটারগুলো কার্লি ব্র্যাকেটে এনক্লোজ করতে হয় যেমন ${10}, ${11} … এবং هكذا।
স্ক্রিপ্ট এক্সিকিউট করার সময়, প্রথম পজিশনাল প্যারামিটার যেটি $0 শেল স্ক্রিপ্টের নাম নেয়। $1 প্যারামিটার টার্মিনালে পাস করা প্রথম ভেরিয়েবল নেয়, $2 দ্বিতীয়, $3 তৃতীয় এবং כך।
নিচের মতো test.sh স্ক্রিপ্ট তৈরি করুন।
#!/bin/bash echo "The name of the script is: " $0 echo "My first name is: " $1 echo "My second name is: " $2
পরবর্তী, স্ক্রিপ্ট এক্সিকিউট করুন এবং আর্গুমেন্ট হিসেবে প্রথম এবং দ্বিতীয় নাম প্রদান করুন:
# bash test.sh James Kiarie
আউটপুট থেকে দেখতে পাচ্ছি যে প্রথম ভেরিয়েবল যেটি প্রিন্ট হয়েছে তা হলো শেল স্ক্রিপ্টের নাম, এই কেসে test.sh। তারপর নামগুলো প্রিন্ট হয়েছে শেল স্ক্রিপ্টে ডিফাইন করা পজিশনাল প্যারামিটার অনুযায়ী।
পজিশনাল প্যারামিটার উপকারী কারণ সেগুলো আপনাকে ডেটা কাস্টোমাইজ করতে সাহায্য করে এক্সপ্লিসিটলি ভেরিয়েবলে ভ্যালু অ্যাসাইন করার পরিবর্তে।
শেল কমান্ড এক্সিট কোড
একটি সিম্পল প্রশ্নের উত্তর দিয়ে শুরু করি, exit code কী?
শেলে ইউজার বা শেল স্ক্রিপ্ট দ্বারা এক্সিকিউট হওয়া প্রতিটি কমান্ডের একটি এক্সিট স্ট্যাটাস থাকে। এক্সিট স্ট্যাটাস হলো একটি ইন্টিজার।
0 এক্সিট স্ট্যাটাস ইন্ডিকেট করে কমান্ড সফলভাবে এক্সিকিউট হয়েছে কোনো এরর ছাড়া। 1 থেকে 255 এর মধ্যে যেকোনো ভ্যালু দেখায় কমান্ড ফেল করেছে বা সফলভাবে এক্সিকিউট হয়নি।
একটি কমান্ডের এক্সিট স্ট্যাটাস খুঁজতে $? শেল ভেরিয়েবল ব্যবহার করুন।
১ এক্সিট স্ট্যাটাস জেনারেল এরর বা যেকোনো Impermissible errors ইন্ডিকেট করে যেমন sudo পারমিশন ছাড়া ফাইল এডিট করা।
২ এক্সিট স্ট্যাটাস কমান্ড বা বিল্ট-ইন শেল ভেরিয়েবল ইনকরেক্ট ব্যবহার ইন্ডিকেট করে।
১২৭ এক্সিট স্ট্যাটাস ilegal কমান্ড ইন্ডিকেট করে যা সাধারণত ‘command not found’ এরর দেয়।
স্ক্রিপ্টের ভিতরে শেল কমান্ড আউটপুট প্রসেস করা
Bash স্ক্রিপ্টিং-এ, আপনি একটি কমান্ডের আউটপুট একটি ভেরিয়েবলে স্টোর করতে পারেন ভবিষ্যতে ব্যবহার করার জন্য। এটিকে শেল কমান্ড সাবস্টিটিউশন ও বলা হয় এবং নিচের উপায়গুলোতে অর্জন করা যায়।
variable=$(command) OR variable=$(/path/to/command) OR variable=$(command argument 1 argument 2 ...)
উদাহরণস্বরূপ, আপনি date কমান্ড একটি ভেরিয়েবলে today নামে স্টোর করতে পারেন এবং শেল স্ক্রিপ্ট কল করলে করেন্ট ডেটা রিভিল করবে।
#!/bin/bash today=$(date) echo “Today is $today”
আরেকটি উদাহরণ নিই। ধরে নিন আপনি আপনার লিনাক্স সিস্টেমে বৈধ লগইন ইউজার খুঁজতে চান। কীভাবে করবেন? প্রথমে, সকল ইউজার (সিস্টেম, প্রসেস, এবং লগইন ইউজার) লিস্ট /etc/passwd ফাইলে স্টোর থাকে।
ফাইল দেখতে আপনাকে cat কমান্ড ব্যবহার করতে হবে। যাইহোক, লগইন ইউজার ন্যারো ডাউন করতে, grep কমান্ড ব্যবহার করুন /bin/bash অ্যাট্রিবিউট 가진 ইউজার সার্চ করতে এবং cut -c 1-10 কমান্ড ব্যবহার করুন নিচে দেখানো মতো নামের প্রথম ১০ ক্যারেক্টার ডিসপ্লে করতে।
আমরা cat command-কে login_users ভেরিয়েবলে স্টোর করেছি।
#!/bin/bash login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10) echo 'This is the list of login users: echo $login_users
এটি আমাদের সিম্পল শেল স্ক্রিপ্ট তৈরি করার টিউটোরিয়ালের শেষ। আশা করি আপনি এটি মূল্যবান পেয়েছেন।