ইউনিক্সঃ সেল সাবস্টিটিউশন (Unix – Shell Substitution)

রিদওয়ান বিন শামীম

 

সাবস্টিটিউশন কী

একটি সেল সাবস্টিটিউশন প্রয়োগ করে তখন, যখন সেটি এমন পরিস্থিতি অনুধাবন করে যা এক বা একাধিক বিশেষ চিহ্ন(স্পেশাল ক্যারেকটার) ধারণ করে থাকে।

নিচের উদাহরণটি এমন একটি ক্ষেত্র যেখানে কোনও চলকের মুদ্রায়িত মান এর মূল মানের দ্বারা প্রতিস্থাপিত হয়েছে। একই সাথে “\n” একটি নতুন লাইনের মাধ্যমে প্রতিস্থাপিত হয়েছে।


#!/bin/sh
 
a=10
echo -e "Value of a is $a \n"

 

-e অপশন প্রয়োগে যা নিম্নোক্ত ফলাফল প্রদান করে,

Value of a is 10 এবং -e অপশন প্রয়োগ না করে ফলাফল হবে, Value of ais10\n ইকো কম্যান্ডের জন্য নিম্নোক্ত এস্কেপ সিকোয়েন্স প্রয়োগ করা যায়,

 

Escape Description
\\ backslash
\a alert (BEL)
\b backspace
\c suppress trailing newline
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab

ব্যাকস্লেস এস্কেপের ইন্টারপ্রিটেশন ডিজেবল রাখতে –E অপশন ও নতুন লাইনের অন্তর্ভুক্তি রহিত করতে –n ব্যবহার করা যায়।

 

কম্যান্ড সাবস্টিটিউশন

কম্যান্ড সাবস্টিটিউশন হল একপ্রকার প্রক্রিয়া যার মাধ্যমে সেল কোনও কম্যান্ডের সেট সম্পাদন করে ও এর আউটপুট দ্বারা কম্যান্ডকে প্রতিস্থাপিত করে।

কম্যান্ড সাবস্টিটিউশন তখন কার্যকর হয় যখন নিম্নোক্ত নির্দেশনা দেয়া থাকে,


`command`

 

এসব ক্ষেত্রে সিঙ্গেল কোট ক্যারেকটারের পরিবর্তে ব্যাককোট ব্যবহার করতে হয়।

উদাহরণ

কম্যান্ড সাবস্টিটিউশন মূলত কম্যান্ডের আউটপুটকে চলকরূপে প্রকাশের জন্য ব্যবহৃত হয়,

নিচের প্রত্যেকটি উদাহরণ কম্যান্ড সাবস্টিটিউশনকে বিবৃত করে।


#!/bin/sh
 
DATE=`date`
echo "Date is $DATE"
 
USERS=`who | wc -l`
echo "Logged in user are $USERS"
 
UP=`date ; uptime`
echo "Uptime is $UP"

 

এই কোডগুলো যে ফলাফল দেখাবে তা হল,


Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

 

চলক সাবস্টিটিউশন

চলক সাবস্টিটিউশন চলকের অবস্থার প্রেক্ষিতে সেল প্রোগ্রামারকে এর মান ব্যবহারের সুযোগ দেয়।

সম্ভাব্য সাবস্টিটিউশন গুলো নিচের ছকে দেয়া হল,

প্রকার বর্ণনা
${var} var. এর মানকে প্রতিস্থাপিত করে
${var:-word} var শূন্য বা আনসেট হলে, var.এর জন্য শব্দ প্রতিস্থাপিত হয়। var এর মান অপরিবর্তিত থাকে।
${var:=word} var শূন্য বা আনসেট হলে, var শব্দের মান অনুসারে নির্ণীত হয়
${var:?message} var শূন্য বা আনসেট হলে, message standard error হিসেবে প্রতীয়মান হয়, চলক ঠিকমত প্রয়োগ করা হয়েছে কিনা এটি তা দেখে।
${var:+word} var সেট হলে শব্দ var এর দ্বারা প্রতিস্থাপিত হয় var এর মান অপরিবর্তিত থাকে।

 

উদাহরণ

নিচে এধরণের সাবস্টিটিউশনের উদাহরণ দেয়া হল,


#!/bin/sh
 
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
 
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
 
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
 
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
 
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

 

উপরের কোডগুলো যে ফলাফল দেখাবে তা হল,


Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
 
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

 

ইউনিক্সঃ সেল লুপ কন্ট্রোল (Unix – Shell Loop Control)

রিদওয়ান বিন শামীম

 

বিভিন্ন কাজের জন্য লুপ তৈরি ও ব্যবহার করার সাথে আমরা সবাই পরিচিত। কখনো কখনো লুপ এড়ানো বা এর পুনরাবৃত্তি করা প্রয়োজন হয়ে পরে।

 

সেল লুপ নিয়ন্ত্রণের জন্য দুটি স্টেটমেন্ট নিয়ে আমরা আলোচনা করব।

  • ব্রেক স্টেটমেন্ট
  • কন্টিনিউ স্টেটমেন্ট

 

ইনফিনিট লুপ

সব লুপের শুরু বা শেষ ও একটি সীমিত ক্রিয়াসীমা থাকে, নির্ধারিত শর্তে পৌঁছে এর ক্রিয়াসীমা শেষ হয়। সেই নির্ধারিত শর্তে না পৌঁছলে লুপ স্থায়ী হয়ে থেকে যেতে পারে। এধরনের লুপ ইনফিনিট লুপ নামে পরিচিত।

 

নিচের উদাহরণে জিরো থেকে ৯ পর্যন্ত নাম্বার প্রদর্শনের নিমিত্তে লুপের প্রয়োগ দেখানো হল।


#!/bin/sh
 
a=10
 
while [ $a -ge 10 ]
do
   echo $a
   a=`expr $a + 1`
done

এই লুপ সারা জীবন স্থায়ী হবে কারণ a সবসময় ১০এর চেয়ে বড় বা এর সমান, এটি কখনো ১০ এরচেয়ে ছোট হবে না।

 

ব্রেক স্টেটমেন্ট

ব্রেক স্টেটমেন্ট সম্পূর্ণ লুপের কার্যক্রম থামাতে ব্যবহৃত হয়, এর পূর্ব পর্যন্ত সকল কোডের কার্যক্রম সম্পন্ন হওয়ার পর।

 

সিনট্যাক্স

লুপের কার্যক্রম থামাতে নিম্নোক্ত ব্রেক স্টেটমেন্ট ব্যবহার করা হয়,


break


 

 

নেস্টেড লুপ থেকে বেরিয়ে যেতে যে ব্রেক কম্যান্ড ব্যবহার করা হয় তা হল,


break n


 

 

n তম লুপ থেকে বেরিয়ে যাওয়ার জন্য এই কোড ব্যবহৃত হয়।

যেমন


#!/bin/sh
 
a=0
 
while [ $a -lt 10 ]
do
   echo $a
   if [ $a -eq 5 ]
   then
      break
   fi
   a=`expr $a + 1`
done

 

উপরের কোড যে ফলাফল দেখাবে তা হল,


0
1
2
3
4
5

 

এই উদাহরণের উভয় লুপের ক্ষেত্রে পরিবর্তন হবে যদি var1 দুইয়ের সমান ও var2 শূন্যের সমান হয়।


#!/bin/sh
 
for var1 in 1 2 3
do
   for var2 in 0 5
   do
      if [ $var1 -eq 2 -a $var2 -eq 0 ]
      then
         break 2
      else
         echo "$var1 $var2"
      fi
   done
done

 

শর্ত পূরণ হলে ইনার লুপ ও আউটার লুপ বিলুপ্ত করে দেয়া হয়,


1 0
1 5

 

কন্টিনিউ স্টেটমেন্ট

লুপের পুনরাবৃত্তির ক্ষেত্রে কন্টিনিউ স্টেটমেন্ট প্রয়োগ করা সম্ভব, এর সিনট্যাক্স হল,


continue


 

 

নেস্টেড লুপ থেকে বেরিয়ে যেতে যে ইন্টেজার আর্গুমেন্ট ব্যবহার করা হয় কন্টিনিউ কমান্ডে তা হল,


continue n


n তম লুপের ক্ষেত্রে এই কোড ব্যবহৃত হয়।

 

উদাহরণ

নিচের উদাহরণে কন্টিনিউ স্টেটমেন্টের এই কোড ব্যবহার করা হয়,


#!/bin/sh
 
NUMS="1 2 3 4 5 6 7"
 
for NUM in $NUMS
do
   Q=`expr $NUM % 2`
   if [ $Q -eq 0 ]
   then
      echo "Number is an even number!!"
      continue
   fi
   echo "Found odd number"
done

 

এটি নিচের মতো ফলাফল দেখাবে,


Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number

 

ইউনিক্সঃ সেল লুপ টাইপ (Unix – Shell Loop Types)

রিদওয়ান বিন শামীম

 

লুপ হল আদর্শ প্রোগ্রামিং অনুষঙ্গ যার দ্বারা কম্যান্ডের সেটকে পুনরাবৃত্তিক ভাবে সম্পাদন করা যায়। সেল প্রোগ্রামিঙের জন্য প্রযোজ্য লুপের প্রকরণগুলোকে নিচে পরীক্ষা করে দেখা হবে।

  • হোয়াইল লুপ
  • ফর লুপ
  • আনটিল লুপ
  • সিলেক্ট লুপ

 

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

 

নেস্টিং লুপ

সব ধরণের লুপ নেস্টিং ধারণাকে সমর্থন করে, এই ধারণা অনুসারে একটি লুপকে সদৃশ আরেকটি লুপের ভেতর স্থাপন করা যায়।

এভাবে হোয়াইল লুপ বা সদৃশ অন্য কোনও লুপকে কীভাবে স্থাপন করা যায় তা দেখানো যাক,

এক হোয়াইল লুপকে অন্য হোয়াইল লুপের অংশ হিসেবে ব্যবহার করা যায়, এর সিনট্যাক্স হল,


while command1 ; # this is loop1, the outer loop
do
   Statement(s) to be executed if command1 is true
 
   while command2 ; # this is loop2, the inner loop
   do
      Statement(s) to be executed if command2 is true
   done
 
   Statement(s) to be executed if command1 is true
done

 

লুপ নেস্টিংএর একটি সহজ উদাহরণ হল,


#!/bin/sh
 
a=0
while [ "$a" -lt 10 ]    # this is loop1
do
   b="$a"
   while [ "$b" -ge 0 ]  # this is loop2
   do
      echo -n "$b "
      b=`expr $b - 1`
   done
   echo
   a=`expr $a + 1`
done

 

নয় গণনার লুপের ভেতর আরেকটি গণনা লুপ প্রয়োগ করার ক্ষেত্রে উপরের কোডিং ব্যবহৃত হয়েছে, যা নিম্নোক্ত ফলাফল দেখায়,


0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
5 4 3 2 1 0
6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

এখানে echo –n কাজ করেছে, -n এর জন্য নতুন লাইন ক্যারেকটার স্থাপন রহিত হয়েছে।

 

ইউনিক্সঃ সেল ডিসিশন মেকিং (Unix – Shell Decision Making)

রিদওয়ান বিন শামীম

 

সেল স্ক্রিপ্ট লেখার সময় দুটি প্রদত্ত পাথ থেকে একটি বেছে নেয়ার প্রয়োজন হতে পারে, সেক্ষেত্রে সঠিক সিদ্ধান্ত নেয়ার জন্য কন্ডিশনাল স্টেটমেন্টের সাহায্য নেয়া যেতে পারে।

ভিন্ন কন্ডিশনে ভিন্ন ভিন্ন পদক্ষেপ নিতে পারে ইউনিক্স সেল এমন কন্ডিশনাল স্টেটমেন্টের সাহায্য নেয়, এখানে আমরা দুই ধরণের ডিসিশন মেকিং স্টেটমেন্ট বিষয়ে আলোচনা করব।

  • if…else স্টেটমেন্ট
  • case…esac স্টেটমেন্ট

 

if…else স্টেটমেন্ট

এক সেট প্রদত্ত অপশন থেকে একটি নির্বাচনের জন্য এই পদ্ধতি প্রয়োগ করা হয়। ইউনিক্স সেল if…else স্টেটমেন্টের যে ফর্মগুলো সমর্থন করে তা হল,

  • ..fi statement
  • ..else…fi statement
  • ..elif…else…fi statement

মাল্টিওয়ে ব্রাঞ্চের জন্য মাল্টিপল if…elif স্টেটমেন্ট প্রয়োগ করা সম্ভব হয়, যদিও এটি সবসময় ফলপ্রসূ নয় কারণ ব্রাঞ্চগুলো একক চলকের উপর নির্ভরশীল থাকতে পারে। এসব ক্ষেত্রে ইউনিক্স সেল case…esac স্টেটমেন্ট সমর্থন করে। এটি কেবলমাত্র এক প্রকরণের হয়ে থাকে,

  • case…esac statement

ইউনিক্স সেল case…esac স্টেটমেন্ট অন্যান্য প্রোগ্রামিং ভাষা যেমন সি বা সি প্লাস প্লাস বা পিইআরএলের switch…case এর সদৃশ।

 

ইউনিক্সঃ সেল বেসিক অপারেটরস (Unix – Shell Basic Operators)

রিদওয়ান বিন শামীম

 

প্রত্যেক সেল সমর্থিত কিছু অপারেটর থাকে। আমরা এখানে ডিফল্ট সেল (Bourne) নিয়ে আলোচনা করব।বর্ন সেলের গুরুত্বপূর্ণ যে অপারেটরগুলো নিয়ে এখানে আলোচনা করা হবেঃ

  • এরিথমেটিক অপারেটর
  • রিলেশনাল অপারেটর
  • বুলিয়েন অপারেটর
  • স্ট্রিং অপারেটর
  • ফাইল টেস্ট অপারেটর

বর্ন সেলের নিজের এরিথমেটিক কাজ সম্পাদনের কৌশল নেই কিন্তু তারা বাইরের প্রোগ্রাম যেমন awk বা expr ব্যবহার করে,

নিচের উদাহরণে দুটি সংখ্যা যোগ করার প্রক্রিয়া দেখানো হল,


#!/bin/sh
 
val=`expr 2 + 2`
echo "Total value : $val"

 

এটি যে ফলাফল দেবে তা হল,


Total value:4


 

 

এখানে কয়েকটি ব্যপার মনে রাখা দরকার,

  • অপারেটর ও এক্সপ্রেশনের মাঝে স্পেস থাকতে হয়,
  • সম্পূর্ণ এক্সপ্রেশন ইনভার্টেড কমা দ্বারা আবদ্ধ করা থাকে

 

এরিথমেটিক অপারেটর

বর্ণ সেল যেসব এরিথমেটিক অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

a চলকের মান ১০ ও b চলকের মান ২০ধরে নিচের ছকে আমরা দেখি,

 

অপারেটর উদাহরণ
+ `expr $a + $b` হয় 30
`expr $a – $b` থেকে পাই -10
* `expr $a \* $b` থেকে পাই 200
/ `expr $b / $a` থেকে পাই 2
% `expr $b % $a` থেকে পাই 0
= a=$b এটি এই বুঝায় যে bএর মান a এর মানের মধ্যে আছে।
== [ $a == $b ] এর রিটার্ন মিথ্যা
!= [ $a != $b ] রিটার্ন সত্য

 

এখানে একটি বিষয় খুব গুরুত্বপূর্ণ যে, কন্ডিশনাল এক্সপ্রেশনকে স্কয়ার ব্র্যাকেটের মধ্যে দুপাশে একটি করে স্পেস দিয়ে আবদ্ধ রাখতে হয়। যেমন,

[ $a == $b ] সঠিক।

[$a==$b] ভুল।

 

সব এরিথমেটিক হিসাব লম্বা পূর্ণসংখ্যার মাধ্যমে করা হয়।

 

রিলেশনাল অপারেটর

বর্ণ সেল যেসব রিলেশনাল অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

অপারেটর উদাহরণ
-eq [ $a -eq $b ] বিবৃতি সত্য নয়
-ne [ $a -ne $b ] বিবৃতি সত্য
-gt [ $a -gt $b ] বিবৃতি সত্য নয়
-lt [ $a -lt $b ] বিবৃতি সত্য
-ge [ $a -ge $b ] বিবৃতি সত্য নয়
-le [ $a -le $b ] বিবৃতি সত্য

 

এখানে একটি বিষয় খুব গুরুত্বপূর্ণ যে, কন্ডিশনাল এক্সপ্রেশনকে স্কয়ার ব্র্যাকেটের মধ্যে দুপাশে একটি করে স্পেস দিয়ে আবদ্ধ রাখতে হয়। যেমন,

[ $a <= $b ] সঠিক।

[$a <= $b] ভুল।

 

বুলিয়েন অপারেটর

বর্ণ সেল যেসব বুলিয়েন অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

a চলকের মান ১০ ও b চলকের মান ২০ধরে নিচের ছকে আমরা দেখি,

 

অপারেটর উদাহরণ
! [ ! false ] বিবৃতি সত্য
-o [ $a -lt 20 -o $b -gt 100 ] বিবৃতি সত্য
-a [ $a -lt 20 -a $b -gt 100 ] বিবৃতি মিথ্যা

 

স্ট্রিং অপারেটর

বর্ণ সেল যেসব স্ট্রিং অপারেটর সমর্থন করে তাদের নিচের ছকে দেয়া হল।

a চলকের মান “abc” ও b চলকের মান “efg”ধরে নিচের ছকে আমরা দেখি,

 

অপারেটর উদাহরণ
= [ $a = $b ] মিথ্যা বিবৃতি
!= [ $a != $b ] সত্য বিবৃতি
-z [ -z $a ] মিথ্যা বিবৃতি
-n [ -z $a ] সত্য বিবৃতি
str [ $a ] সত্য বিবৃতি

 

ফাইল টেস্ট অপারেটর

ইউনিক্স ফাইলের বিভিন্ন প্রপার্টি টেস্টের জন্য যে অপারেটর সেগুলো নিচে দেয়া হয়েছে।

১০০ বাইটের “test” নামের চলক ফাইলের জন্য টেস্ট অপারেটরঃ

 

অপারেটর উদাহরণ
-b file [ -b $file ] বিবৃতি সত্য
-c file [ -c $file ] বিবৃতি সত্য নয়
-d file [ -d $file ] বিবৃতি সত্য নয়
-f file [ -f $file ] বিবৃতি সত্য
-g file [ -g $file ] বিবৃতি সত্য নয়
-k file [ -k $file ] বিবৃতি সত্য নয়
-p file [ -p $file ] বিবৃতি সত্য নয়
-t file [ -t $file ] বিবৃতি সত্য নয়
-u file [ -u $file ] বিবৃতি সত্য নয়
-r file [ -r $file ] বিবৃতি সত্য
-w file [ -w $file ] বিবৃতি সত্য
-x file [ -x $file ] বিবৃতি সত্য
-s file [ -s $file ] বিবৃতি সত্য
-e file [ -e $file ] বিবৃতি সত্য

 

ইউনিক্সঃ সেল অ্যারি ব্যবহার করা (Unix – Using Shell Arrays)

রিদওয়ান বিন শামীম

 

সেল ভেরিয়েবল একক মান ধারণে সক্ষম। এই ধরণের ভেরিয়েবল বা চলককে স্কেলার চলক বলে। সেল অ্যারি ভেরিয়েবল নামের ভিন্ন একধরনের চলক সমর্থন করে যারা একসাথে অনেকগুলো মান ধারনে সক্ষম। অ্যারি ভেরিয়েবল চলকের সেট গ্রুপিং এর জন্য একটি পদ্ধতি ব্যবহার করে। চলকের নতুন নাম সৃষ্টির পরিবর্তে,একক অ্যারি ভেরিয়েবল ব্যবহার করা যায় যার মধ্যে অন্য চলকগুলোকে সংরক্ষণ করা যাবে।

 

অ্যারি ভ্যালুর বিবৃতি

অ্যারি ভেরিয়েবল ও স্কেলার ভেরিয়েবলের মধ্যে যে পার্থক্য তা নিচে দেখানো হল,

ধরা যাক কোনও চলকের মধ্যে থাকে কিছু ছাত্রের নাম নিয়ে আমরা কাজ করতে চাই, প্রত্যেকটি স্বতন্ত্র চলক (নিচের মত) একটি করে স্কেলার চলক।


NAME01=”Zara”
NAME02=”Qadir”
NAME03=”Mahnaz”
NAME04=”Ayan”
NAME05=”Daisy”


 

আমরা এই সবগুলো নাম সংরক্ষণের জন্য একক অ্যারি ব্যবহার করতে পারি। নিচে অ্যারি ভেরিয়েবল তৈরির সহজ একটি উপায় দেয়া হল,


array_name[index]=value


 

এখানে array_name হল অ্যারির নাম, index হল আইটেমের ইনডেক্স আর value হল আইটেমের যে ভ্যালু আমরা সেট করতে চাই। উদাহরণ হিসেবে কম্যান্ডগুলো হল,


NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"

 

ksh সেল ব্যবহার করে থাকলে অ্যারি শুরু করতে যে সিনট্যাক্স ব্যবহার করতে হবে তা হল,


set-A array_name value1 value2... valuen

 

bash সেল ব্যবহার করে থাকলে অ্যারি শুরু করতে যে সিনট্যাক্স ব্যবহার করতে হবে তা হল,


array_name=(value1... valuen)

 

অ্যারি ভ্যালুতে প্রবেশ করা

কোনও অ্যারি ভেরিয়েবল তৈরির পর সেটিতে প্রবেশ করার জন্য কোড,


${array_name[index]}


 

এখানে array_name হল অ্যারির নাম, index হল যে ভ্যালু প্রবেশ করাব তার ইনডেক্স।নিচে একটি সহজ উদাহরণ দেয়া যাক,


#!/bin/sh
 
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

 

যেটির ফলাফল হবে এমন,


$./test.sh
First Index: Zara
Second Index: Qadir


 

অ্যারির সবগুলো আইটেমে আমরা নিচের যেকোনো একটি উপায়ে ঢুকতে পারি,


${array_name[*]}
${array_name[@]}


 

এখানে array_name হল সেই অ্যারির নাম যাতে আমরা ঢুকতে চাই। নিচে এর একটি সরল উদাহরণ দেয়া হল,


#!/bin/sh

NAME[0]=”Zara”
NAME[1]=”Qadir”
NAME[2]=”Mahnaz”
NAME[3]=”Ayan”
NAME[4]=”Daisy”
echo “First Method: ${NAME[*]}”
echo “Second Method: ${NAME[@]}”


 

এটি যে ফলাফল দেখাবে তা হল,


$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy


 

ইউনিক্সঃ স্পেশাল ভেরিয়েবলস (Unix – Special Variables)

রিদওয়ান বিন শামীম

 

পূর্ববর্তী টিউটোরিয়ালে ভেরিয়েবল নামে নন আলফানিউমেরিক ক্যারেক্টার ব্যবহার বিষয়ে সতর্ক করা হয়েছিল, কারণ ইউনিক্স চলকে এদের ভিন্ন অর্থ হয়।

যেমন, $ ক্যারেক্টার কারেন্ট সেলে আইডি নাম্বার বা পিআইডি প্রক্রিয়া বোঝায়।


$echo $$


 

উপরের কম্যান্ড কারেন্ট সেলের পিআইডি যেভাবে বোঝায়,


29949


 

নিচের ছকে সেল স্ক্রিপ্টে ব্যবহার করা যায় এমন স্পেশাল ভেরিয়েবল দেখানো হল,

Variable Description
$0 কারেন্ট স্ক্রিপ্টের ফাইল নেম
$n এই চলক সেসব আর্গুমেন্টের সাথে সমন্বয় করে যারা স্ক্রিপ্টকে সাহায্য করে।
$# স্ক্রিপ্টে সরবরাহ করা আর্গুমেন্টের সংখ্যা
$* সব আর্গুমেন্ট ডাবল কোটেড। কোনও স্ক্রিপ্ট দুটি আর্গুমেন্ট রিসিভ করলে $* , $1 $2 এর সমপর্যায়ের।
$@ সব আর্গুমেন্ট স্বতন্ত্রভাবে ডাবল কোটেড। কোনও স্ক্রিপ্ট দুটি আর্গুমেন্ট রিসিভ করলে $@, $1 $2 এর সমপর্যায়ের।
$? সর্বশেষ সম্পাদিত কম্যান্ডের এক্সিট স্ট্যাটাস
$$ কারেন্ট সেলের প্রসেস নাম্বার
$! সর্বশেষ ব্যাকগ্রাউন্ড সেলের প্রসেস নাম্বার

 

কম্যান্ড লাইন আর্গুমেন্টঃ কম্যান্ড লাইন আর্গুমেন্ট $1, $2, $3,…$9 হল পজিসনাল প্যারামিটার যার $0 প্রকৃত কম্যান্ড, সেল স্ক্রিপ্ট,প্রোগ্রাম বা ফাংশন ও $1, $2, $3, …$9 হল কম্যান্ডের আর্গুমেন্ট।

নিচের স্ক্রিপ্ট কম্যান্ড লাইন সংশ্লিষ্ট বিভিন্ন স্পেশাল ভেরিয়েবলস ব্যবহার করে,


#!/bin/sh

echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

 

নিচে উপরের স্ক্রিপ্টের পরীক্ষামূলক সম্পাদন দেয়া হল,


$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

 

স্পেশাল প্যারামিটার $* and $@ঃ কম্যান্ড লাইন আর্গুমেন্টে ঢোকার জন্য স্পেশাল প্যারামিটার আছে, $* ও $@ এমন স্পেশাল প্যারামিটার, যারা ডাবল কোটে আবদ্ধ হওয়ার আগ পর্যন্ত একই রকম প্রতিক্রিয়া দেখায়। আমরা অজানা সংখ্যক কম্যান্ড লাইন আর্গুমেন্টের প্রক্রিয়ার জন্য $* বা $@ যেকোনো স্পেশাল প্যারামিটার দিয়ে সেল স্ক্রিপ্ট লিখতে পারি।


#!/bin/sh
 
for TOKEN in $*
do
   echo $TOKEN
done

 

উপরের স্ক্রিপ্টের পরীক্ষামূলক সম্পাদন


$./test.sh Zara Ali 10 Years Old
Zara
Ali
10
Years
Old

 

এক্সিট স্ট্যাটাস

$?চলক পূর্ববর্তী কম্যান্ডের এক্সিট স্ট্যাটাস নির্দেশ করে। এক্সিট স্ট্যাটাস হল একপ্রকারের নিউমেরিক্যাল মান যা কম্যান্ড সম্পন্ন হওয়ার সাথে সাথে আবর্তিত হয়।

নিচে সফল কম্যান্ডের উদাহরণ দেয়া হল,


$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$


 

ইউনিক্সঃ সেল ভেরিয়েবল বা চলক ব্যবহার করা (Unix – Using Shell Variables)

রিদওয়ান বিন শামীম

 

ভেরিয়েবল বা চলক একপ্রকারের ক্যারেক্টার স্ট্রিং যেটিতে আমরা মান আরোপ করি। এই মান সংখ্যা, টেক্সট, ফাইলনেম, ডিভাইস বা যেকোনো ডাটাও হতে পারে। চলক আসলে মূল ডাটার নির্দেশক বই কিছু নয়।

 

চলকের নাম

চলকের নাম অক্ষর, সংখ্যা বা আন্ডারস্কোর বিশিষ্ট হতে পারে। ইউনিক্স সেল চলকের নাম বড় হাতের অক্ষরের হয়।

নিচের উদাহরণ চলকের গ্রহণযোগ্য উদাহরণ


_ALI
TOKEN_A
VAR_1
VAR_2

 

আবার নিচের উদাহরণ চলকের গ্রহণযোগ্য উদাহরণ না।


2_VAR
-VARIABLE
VAR1-VAR2
VAR_A!

এক্ষেত্রে !,*, বা – ব্যবহার করা যাবে না বলেই এটি বৈধ উদাহরণ না। সেলের ক্ষেত্রে এগুলোর স্বতন্ত্র মানে দাঁড়ায়।

 

চলক বিবৃতি

চলককে নিচের কোড দ্বারা বিবৃত করা হয়।


variable_name=variable_value


 

উদাহরণস্বরূপ,


NAME=”Zara Ali”


 

এই উদাহরণে NAME হল চলক আর “Zara Ali” হল এতে আরোপিত মান। এধরনের চলককে স্কেলার চলক বলে, একক সময়ে এগুলো একটি মাত্র মান ধারণ করে।

চলকে আমরা যে মান চাই সেল তাই সংরক্ষণের সুযোগ দেয়। যেমন,


VAR1="Zara Ali"
VAR2=100

 

মানে প্রবেশ করা

চলকে সংরক্ষিত মানে প্রবেশ করতে হলে নামের সাথে ( $) চিহ্ন ব্যবহার করতে হয়।

যেমন,


#!/bin/sh
NAME="Zara Ali"
echo $NAME

 

উপরের কোড যে ফলাফল দেখাবে তা হল,


ZaraAli


 

রিড অনলি চলক

readonly কম্যান্ড দ্বারা নির্ধারিত এই চলকের মান পরবর্তীতে আর পরিবর্তন করা যায় না।

 

যেমন নিচের উদাহরণে কোনও নামের মান পরিবর্তন করলে তা ভুল চলক হয়ে যাবে।


#!/bin/sh
NAME="Zara Ali"
readonly NAME
NAME="Qadiri"

 

যার ফলে যে ফলাফল হবে তা হল,


/bin/sh: NAME:This variableis read only.

 

আনসেটিং চলক

কোনও চলককে আনসেট করার পর সেটিতে আর কোনও মান আরোপ করা যায় না।

নিচের উদাহরণে unset কম্যান্ড ব্যবহার করে বিবৃত চলককে আনসেট করার সিনট্যাক্স ব্যবহার করা হয়,


 unset variable_name

 

নিচে এর একটি উদাহরণ দেয়া যাক,

#!/bin/sh


NAME="Zara Ali"
unset NAME
echo $NAME

 

চলকের প্রকারভেদ

সেল সক্রিয় থাকার সময় তিন প্রকারের চলক দেখা যায়,

  • লোকাল চলক,
  • এনভায়রনমেন্ট চলক,
  • সেল চলক।

 

ইউনিক্সঃ vi এডিটর টিউটোরিয়াল । UNIX VI Editor Tutorial

রিদওয়ান বিন শামীম

 

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

  • এটি ইউনিক্স সংশ্লিষ্ট সব অনুসঙ্গে উপযোগী
  • এর প্রায়োগিক দিকগুলো বোর্ডের জন্য বিশেষ উপযোগী
  • এটির অনেক কম রিসোর্স লাগে
  • এটি অন্যান্য এডিটরের চেয়ে অনেক বেশি ইউজার ফ্রেন্ডলি

 

vi এডিটর শুরু করা

নিচের উপায়েগুলোর মাধ্যমে vi এডিটর ব্যবহার শুরু করা যায়,

কম্যান্ড
vi filename
vi -R filename
view filename

নতুন testfile নামক ফাইল তৈরির জন্য,


$vi testfile

 

এর ফলাফলে স্ক্রীনে আমরা যা দেখতে পাব তা হল,


|
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
 "testfile" [New File]

 

অপারেশন মোড

vi এডিটর দ্বারা কাজ করার সময় আমরা দুটি মোড দেখতে পাব,

  • কম্যান্ড মোড
  • ইনসার্ট মোড

 

vi এডিটর থেকে বেরিয়ে আসতে

সেভ না করে বেরিয়ে আসতে q! কম্যান্ড, সেভ করতে w কম্যান্ড আর সেভ করে বেরিয়ে আসার জন্য সবচেয়ে সহজ কম্যান্ড ZZ কম্যান্ড আমরা ব্যবহার করতে পারি।

 

ফাইলের পরিসরে মুভ করা

নিচে কয়েকটি কম্যান্ড দেয়া হল যার মাধ্যমে কোনও ক্যারেক্টারকে আমরা ফাইলের পরিসরে মুভ করাতে পারি।

কম্যান্ড বর্ণনা
k কার্সরকে এক লাইন উপরে উঠায়
j কার্সরকে এক লাইন নিচে নামায়
h কার্সরকে এক ক্যারেক্টার বামে সরায়
l কার্সরকে এক ক্যারেক্টার ডানে সরায়

খেয়াল রাখতে হবে,

  • vi এডিটর কেস সেন্সেটিভ
  • কম্যান্ড প্রেফারেন্স একশন সংখ্যার উপর নির্ভর করে

ফাইল মুভ করানোর আরও কিছু কম্যান্ড আছে, যেগুলো মোটামুটিভাবে এগুলোঃ

কম্যান্ড
0 or |
$
w
b
(
)
E
{
}
[[
]]
n|
1G
G
nG
:n
fc
Fc
H
nH
M
L
nL
😡

 

কন্ট্রোল কম্যান্ড

কন্ট্রোল কী এর সাথে ব্যবহার করা যায় এমন কিছু কম্যান্ড নিচে দেয়া হল,

কম্যান্ড
CTRL+d
CTRL+d
CTRL+f
CTRL+u
CTRL+b
CTRL+e
CTRL+y
CTRL+u
CTRL+d
CTRL+b
CTRL+f
CTRL+I

 

ফাইল এডিট করা

ফাইল এডিট করতে ইনসার্ট মোডে থাকতে হয়। কম্যান্ড মোড থেকে ইনসার্ট মোডে যেতে কয়েকটি কম্যান্ড আছে,

কম্যান্ড
i
I
a
A
o
O

 

ক্যারেক্টার ডিলিট করতে

ওপেন করা ফাইল থেকে লাইন ও ক্যারেক্টার ডিলিট করতে প্রয়োজনীয় কম্যান্ডের লিস্ট নিচে দেয়া হল,

কম্যান্ড
x
X
dw
d^
d$
D
dd

 

চেঞ্জ কম্যান্ড

vi এডিটরে লাইন বা ক্যারেক্টার ডিলিট না করে পরিবর্তন করারও সুযোগ রয়েছে, এ সংশ্লিষ্ট কয়েকটি কম্যান্ড নিচে দেয়া হল,

কম্যান্ড
cc
cw
r
R
s
S

 

কপি ও পেস্ট কম্যান্ড

নিচের কমান্ডগুলো কপি ও পেস্ট করার জন্য প্রয়োজন হয়,

কম্যান্ড
yy
yw
p
P

 

এডভান্সড কম্যান্ড

vi এডিটরে আরও কিছু এডভান্সড কম্যান্ড এর ব্যবহারকে আরও ফলপ্রসূ করে তুলছে-

কম্যান্ড
J
<<
>>
~
^G
U
u
J
:f
:f filename
:w filename
:e filename
:cd dirname
:e #
:n
:p
:N
:r file
:nr file

 

ওয়ার্ড ও ক্যারেক্টার সার্চ করতে

সার্চের সময় দুটি কম্যান্ডে ব্যতিক্রম ঘটে,

  • / command ফাইলে ফরোয়ার্ড(ডাউনওয়ার্ড) সার্চ ও
  • ? command ফাইলে ব্যাকওয়ার্ড(আপওয়ার্ড) সার্চ সম্পাদন করে

সার্চ কম্যান্ডের কিছু অনুষঙ্গ নিচে দেয়া হল,

ক্যারেক্টার
^
.
*
$
[
<
>

 

সেট কম্যান্ড

সেট কম্যান্ডের জন্য কম্যান্ড মোডে ফিরে এসে নিচের যে কোনও কম্যান্ড ব্যবহার করে আমরা vi স্ক্রীনের চেহারা ও অনুভূতি পরিবর্তন করতে পারি,

কম্যান্ড
:set ic
:set ai
:set noai
:set nu
:set sw
:set ws
:set wm
:set ro
:set term
:set bf

 

কম্যান্ড রান করানো

vi এডিটরে প্রক্রিয়াধীন প্রকল্পকেও কম্যান্ড দ্বারা রান করানো যায়।

 

টেক্সট রিপ্লেস করা

নিচের কোড ব্যবহার করে শব্দ বা শব্দসমষ্টিকে রিপ্লেস করানো যায়,


:s/search/replace/g


 

 

মনে রাখা দরকার,

  • কম্যান্ড ব্যবহারের জন্য কম্যান্ড মোড ব্যবহার করা দরকার
  • সব কম্যান্ডের জন্য কেস(ক্যাপিটালাইজেশন) সচেতন থাকা দরকার
  • টেক্সট প্রবেশ করাতে ইনসার্ট মোডে থাকতে হবে

 

ইউনিক্সঃ সেল কি? (Unix – What is Shells?)

রিদওয়ান বিন শামীম

 

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

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

 

সেল প্রম্পট

$ দ্বারা কম্যান্ড প্রম্পট বোঝায়, এটি সেলের মাধ্যমে প্রবর্তিত হয়ে থাকে। কীবোর্ডে এন্টার চাপার পর সেল ইনপুট পড়তে পারে। ইনপুটের প্রথম শব্দ দেখেই সেল কম্যান্ড সম্পর্কে ধারণা পেয়ে যায়। শব্দ মূলত নিরবচ্ছিন্ন ক্যারেকটারের সেট, স্পেস এবং ট্যাব যাদেরকে পৃথক করে রাখে।

নিচের উদাহরণে ডেট কম্যান্ডের উদাহরণ দেয়া হল,


$date
ThuJun2508:30:19 MST2009

কম্যান্ড প্রম্পটকে পরিবেশ চলকের মাধ্যমে কাস্টমাইজ করা যায়।

 

সেল টাইপ

ইউনিক্সে প্রধানত দুই ধরণের সেল টাইপ আছে,

  • বর্ন সেল
  • সি সেল

এদের মধ্যে বর্ন সেল আবার কয়েক রকমের হয়,

  • বর্ন সেল,
  • কর্ন সেল,
  • বর্ন এগেইন সেল,
  • পিওসিক্স সেল।

কয়েকটি সি টাইপ সেল হল,

  • সি সেল
  • টেনেক্স/টপস সি সেল

মূল ইউনিক্স সেল স্টিফেন বার্নের উদ্ভাবিত ধারণা, ৭০এর দশকের মাঝামাঝি তিনি নিউ জার্সির এটিএন্ড টি বেল ল্যাবে থাকার সময় এটি লেখেন।

 

সেল স্ক্রিপ্টস

সেল স্ক্রিপ্টস এর মূল ধারণা হল কম্যান্ডের লিস্ট, যা সম্পাদনার ক্রমানুসারে সজ্জিত থাকে। আদর্শ সেল স্ক্রিপ্টে ধাপ গুলো # চিহ্ন দ্বারা সজ্জিত থাকে।

 

পরীক্ষামূলক স্ক্রিপ্ট

.sh এক্সটেনশন দ্বারা এটিকে বোঝানো হয়, এক্ষেত্রে সিস্টেমকে নিম্নোক্ত কোডের মাধ্যমে আগেই জানাতে হয় যে এরকমের একটি স্ক্রিপ্ট চালু করা হচ্ছে।


 #!/bin/sh

 

এই ধরণের স্ক্রিপ্ট চালুর জন্য আগে সেবাং (shebang) লাইন এবং তার পর কম্যান্ড যোগ করতে হয়।


#!/bin/bashpwdls

 

সেল কম্যান্ড

স্ক্রিপ্টে নিম্নোক্ত ভাবে কম্যান্ড লেখা যায়,


#!/bin/bash
 
# Author : Zara Ali
# Copyright (c) Tutorialspoint.com
# Script follows here:
pwd
ls

উপরের উপাদানগুলো সংরক্ষণ করে স্ক্রিপ্টকে সম্পাদনযোগ্য করা হয়,


$chmod+x test.sh

 

এখন সম্পাদনযোগ্য সেল স্ক্রিপ্ট পাওয়া গেলো,


$./test.sh

 

যা থেকে নিম্নোক্ত ফলাফল পাওয়া যায়,


/home/amrood
index.htm  unix-basic_utilities.htm  unix-directories.htm  
test.sh    unix-communication.htm    unix-environment.htm

বর্তমান ডিরেক্টরিতে থাকা কোনও প্রোগ্রাম সম্পাদনের জন্য ./program_name ব্যবহার করা হয়।

 

এক্সটেনডেড সেল স্ক্রিপ্ট

নিচের কম্যান্ড read কম্যান্ড ব্যবহার করে যা কীবোর্ড থেকে ইনপুট নেয় এবং PERSON চলকের মান বিবৃত করে ও STDOUT এ মুদ্রিত করে।


#!/bin/sh
 
# Author : Zara Ali
# Copyright (c) Tutorialspoint.com
# Script follows here:
 
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

 

স্ক্রিপ্টের পরীক্ষামূলক সম্পাদন,


$./test.sh
What is your name?
Zara Ali
Hello, Zara Ali
$