পিএইচপি ৫ ফরম – ই-মেইল এবং URL সন্নিবেশ করা (PHP 5 Forms – Validate E-mail and URL)

এই অধ্যায়ে আমরা ই-মেইল ও URL কিভাবে বেলিডেট করা যায় সে সম্পর্কে আলোচনা করবো।

পিএইচপি – নাম যাচাই করা

নিচের কোডটি নিশ্চিত করে যে, এতে শুধুমাত্র লেটার বা বর্ণ থাকবে এবং কোন ফাঁকা স্থান থাকবে না। যদি শর্ত না মানে তাহলে এরর ম্যাসেজ দেখাবে।


$name = test_input($_POST["name"]);
 if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
   $nameErr = "Only letters and white space allowed"; 
 }

 

preg_match() ফাংশন স্ট্রিং এর ধরণ খুঁজে দেখে এবং যদি ফাংশনে উল্লেখিত ধরণ সঠিক থাকে তাহলে সত্য ফেরত দেয় না হলে মিথ্যা ফেরত দেয়।

 

পিএইচপি – ই-মেইল যাচাই করা

filter_var() ফাংশনের মাধ্যমে পিএইচপি যাচাই করে দেখে যে ই-মেইল এন্ট্রিটি সঠিকভাবে প্রবেশ করানো হয়েছে কিনা।


$email = test_input($_POST["email"]);
 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
   $emailErr = "Invalid email format"; 
 }

 

 

পিইএচপি – URL যাচাই করা

নিচের কোডটি URL ঠিকানা ঠিকভাবে লেখা হয়েছে কিনা তা যাচাই করে দেখে


$website = test_input($_POST["website"]);
 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)
    [-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
   $websiteErr = "Invalid URL"; 
 }

 

 

পিইএচপি – নাম, ই-মেইল, URL যাচাইকরণ


<?php
 // define variables and set to empty values
 $nameErr = $emailErr = $genderErr = $websiteErr = "";
 $name = $email = $gender = $comment = $website = "";
 
 if ($_SERVER["REQUEST_METHOD"] == "POST") {
   if (empty($_POST["name"])) {
     $nameErr = "Name is required";
   } else {
     $name = test_input($_POST["name"]);
     // check if name only contains letters and whitespace
     if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
       $nameErr = "Only letters and white space allowed"; 
     }
   }
 
   if (empty($_POST["email"])) {
     $emailErr = "Email is required";
   } else {
     $email = test_input($_POST["email"]);
     // check if e-mail address is well-formed
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
       $emailErr = "Invalid email format"; 
     }
   }
 
   if (empty($_POST["website"])) {
     $website = "";
   } else {
     $website = test_input($_POST["website"]);
     // check if URL address syntax is valid 
        (this regular expression also allows dashes in the URL)
     if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)
        [-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
       $websiteErr = "Invalid URL"; 
     }
   }
 
   if (empty($_POST["comment"])) {
     $comment = "";
   } else {
     $comment = test_input($_POST["comment"]);
   }
 
   if (empty($_POST["gender"])) {
     $genderErr = "Gender is required";
   } else {
     $gender = test_input($_POST["gender"]);
   }
 }
 ?>

 

 

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

 

 

ইউনিক্সঃ সেল ফাংশন (Unix – Shell Functions)

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

 

ফাংশন কোনও স্ক্রিপ্টের ফাংশনালিটিকে ছোট ছোট লজিকাল সাবসেকশনে ভাগ করে যাতে এগুলো প্রয়োজনমত তাদের কাজ সম্পন্ন করতে পারে।

পুনরাবৃত্তিমূলক কাজ সম্পাদনের জন্য ফাংশন ব্যবহার করা কোডের পুনঃব্যবহারের একটি ভাল উপায়। কোডের পুনঃব্যবহার বর্তমান সময়ের অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিঙের একটি গুরুত্বপূর্ণ অংশ।

সেল ফাংশন অন্যান্য প্রোগ্রামিং ভাষার সাবরুটিন, প্রক্রিয়া ও ফাংশনের মতই।

 

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

ফাংশন হিসেবে স্বীকৃতি পেতে নিচের সিনট্যাক্স ব্যবহার করতে হয়,


function_name () { 
   list of commands
}

 

নিচে ফাংশনের ব্যবহারের সহজ উদাহরণ দেয়া হল,


#!/bin/sh
 
# Define your function here
Hello () {
   echo "Hello World"
}
 
# Invoke your function
Hello

 

উপরের কোডকে কার্যে পরিণত করলে নিম্নে প্রদত্ত ফলাফল পাওয়া যাবে,


$./test.sh
Hello World
$

 

ফাংশনের পাস প্যারামিটার

কিছু ফাংশন কাজের ক্ষেত্রে প্যারামিটার গ্রহণ করে, $1, $2 এসব দ্বারা এই ফাংশন প্রকাশ করা হয়,


#!/bin/sh
 
# Define your function here
Hello () {
   echo "Hello World $1 $2"
}
 
# Invoke your function
Hello Zara Ali

 

যা নিচের ফলাফল দেখাবে,


$./test.sh
Hello World Zara Ali
$

 

ফাংশন থেকে মান ফিরিয়ে আনাঃ return কম্যান্ড ব্যবহার করে ফাংশন থেকে যেকোনো মান ফিরিয়ে আনা সম্ভব, যার সিনট্যাক্স হল,


return code

 

এখানে যেকোনো কোড হতে পারে কিন্তু তা স্ক্রিপ্টের কনটেক্সটে অর্থবোধক হতে হবে।

যেমন, নিচের ফাংশন ভ্যালু ফিরিয়ে আনে,


#!/bin/sh
 
# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}
 
# Invoke your function
Hello Zara Ali
 
# Capture value returnd by last command
ret=$?
 
echo "Return value is $ret"

 

যা নিম্নোক্ত ফলাফল দেবে,


$./test.sh
Hello World Zara Ali
Return value is 10
$

 

নেস্টেড ফাংশন

ফাংশনের একটি মজার ফিচার হল, এটি অন্য ফাংশনকে যেমন কল করতে পারে তেমনি নিজেদেরও কল করতে পারে। এধরনের ফাংশনকে রিকারসিভ ফাংশন বলে।

দুটি ফাংশনের নেস্টিং নিচের উদাহরণে দেয়া হল,


#!/bin/sh
 
# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}
 
number_two () {
   echo "This is now the second function speaking..."
}
 
# Calling function one.
number_one

 

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


This is the first function speaking...
This is now the second function speaking...

 

প্রম্পট থেকে ফাংশন কল

.profile এর ভিতরে সচরাচর ব্যবহৃত ফাংশনের জন্য সংজ্ঞা অন্তর্ভুক্ত করা যায়,অপরদিকে test.sh জাতীয় ফাইলে সংজ্ঞার গ্রুপ সংবদ্ধ করে কারেন্ট সেলে নিচের কোড দ্বারা সম্পাদন করা যায়,


$. test.sh

 

যা কিনা কারেন্ট সেলকে নিচের মত করে বিবৃত করে,


$ number_one
This is the first function speaking...
This is now the second function speaking...
$

 

সেল থেকে কোনও ফাংশনের সংজ্ঞা মুছে ফেলতে .f অপশনের সাথে unset কম্যান্ড ব্যবহার করতে হয়, এটি সেই একই কম্যান্ড যা সেল থেকে চলকের বিবরণ মুছে ফেলতে ব্যবহৃত হয়,


$unset.f function_name

 

ইউনিক্সঃ সেল ইনপুট/আউটপুট রিডাইরেকশন (Unix – Shell Input/Output Redirections)

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

 

বেশিরভাগ ইউনিক্স সিস্টেম কম্যান্ড টার্মিনাল থেকে ইনপুট গ্রহণ করে এবং টার্মিনালে আউটপুট প্রদান করে।

কম্যান্ড স্ট্যান্ডার্ড ইনপুট থেকে ইনপুট পড়ে ও স্ট্যান্ডার্ড আউটপুটে আউটপুট লিখে।

 

আউটপুট রিডাইরেকশন

নিচের who কম্যান্ড ইউজার ফাইলের কম্যান্ডের পুরোপুরি আউটপুটে পরিণত হবে,


$ who> users


 

এখানে লক্ষ্য করার মত বিষয়, টার্মিনালে কোনও আউটপুট নেই, কারণ আউটপুট স্পেসিফাইড ফাইলে চলে গেছে, সেটি ডিফল্ট স্ট্যান্ডার্ড আউটপুট ডিভাইস(এক্ষেত্রে টার্মিনাল) থেকে রিডাইরেক্ট হয়ে গেছে। যদি আমরা users ফাইল চেক করে দেখি তাহলে পরিপূর্ণ উপাদান দেখব,


$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

 

রিডাইরেক্ট হওয়া ডাটা যে ফাইলে যাবে সে ফাইলে আগের কোনও ডাটা থাকলে তা মুছে যাবে, আমরা এ বিষয়টি নিচের উদাহরণে দেখতে পারি,


$ echo line1> users
$ cat users
line1$

 

পূর্বে থাকা কোনও ফাইলে আউটপুট বিস্তারনের জন্য আমরা >> অপারেটর ব্যবহার করতে পারি।


$ echo line2>> users
$ cat users
line1
line2
$

 

ইনপুট রিডাইরেকশন

আউটপুট যেমন রিডাইরেক্ট হয়ে ফাইলে আসতে পারে তেমনি ফাইল থেকে ইনপুট রিডাইরেক্ট হয়ে চলেও যেতে পারে। আউটপুট রিডাইরেকশন যেমন > ক্যারেক্টার দ্বারা প্রকাশ পায় তেমনি ইনপুট রিডাইরেকশন < ক্যারেক্টার দ্বারা প্রকাশ পায়।

যেমন, users ফাইলের লাইন নাম্বার নিচের কম্যান্ড থেকে বের করা যায়,


$ wc-l users
2 users
$

 

এখানে আউটপুট ২ লাইনের। users ফাইলের wc কম্যান্ডের স্ট্যান্ডার্ড ইনপুটের রিডাইরেকশনের মাধ্যমে আমরা লাইন সংখ্যা জানতে পারি।


$ wc-l< users
2
$

 

হেয়ার ডকুমেন্ট

হেয়ার ডকুমেন্টের সাধারণ ফর্ম এরকম,


command<< delimiter
document
delimiter

 

মোট লাইনসংখ্যা জানার wc –l কম্যান্ডের ইনপুট এরকম,


$wc -l << EOF
        This is a simple lookup program 
        for good (and bad) restaurants
        in Cape Town.
EOF
3
$

 

স্ক্রিপ্ট ব্যবহার করে মাল্টিপল লাইন প্রিন্ট করতে here document কম্যান্ড ব্যবহার করা যায়,


#!/bin/sh
 
cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

 

যা এরকম ফলাফল দেখাবে,


This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

 

এই স্ক্রিপ্ট vi টেক্সট এডিটর দিয়ে একটি সেশন চালাবে এবং test.txt ফাইলে ইনপুট সংরক্ষণ করবে।


#!/bin/sh
 
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

 

vi টেক্সট এডিটরের স্থলে vim টেক্সট এডিটর ব্যবহার করলে স্ক্রিপ্টের আউটপুট এরকম হবে,


$ sh test.sh
Vim: Warning: Input is not from a terminal
$

 

স্ক্রিপ্ট চালুর পর test.txt ফাইলে ফাইলে আমরা যা দেখব তা এরকম,


$ cat test.txt
This file was created automatically from
a shell script
$

 

আউটপুট ডিসকার্ড করা

আউটপুটকে /dev/null ফাইলে রিডাইরেক্ট করে এটি করা হয়,


$ command>/dev/null

 

কম্যান্ডের আউটপুট ও এর এরর আউটপুট দুটিকে ডিসকার্ড করতে


$ command>/dev/null2>&1

 

STDIN কে STDERR তে রিডাইরেক্ট করে ম্যাসেজ প্রদর্শন করতে


$ echo message1>&2

এই কোড ব্যবহার করা যায়।

 

রিডাইরেকশন কম্যান্ড

এরকম কয়েকটি রিডাইরেকশন কম্যান্ড হল,

কম্যান্ড
pgm > file
pgm < file
pgm >> file
n > file
n >> file
n >& m
n <& m
<< tag
|

মনে রাখা দরকার, ফাইল ডেসক্রিপ্টর ০ হল নরমাল স্ট্যান্ডার্ড ইনপুট (STDIN), ১ হল স্ট্যান্ডার্ড আউটপুট (STDOUT) আর ২ হল স্ট্যান্ডার্ড এরর আউটপুট (STDERR) ।

 

ইউনিক্সঃ সেল কোটিং মেকানিজম (Unix – Shell Quoting Mechanisms)

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

 

মেটাক্যারেক্টার

ইউনিক্স সেল বিভিন্ন মেটাক্যারেক্টার ব্যবহার করে যারা সেল স্ক্রিপ্টে ব্যবহৃত হওয়ার সময় স্বতন্ত্র অর্থ প্রকাশ করে। যেমন


*?[]' " \ $ ; & ( ) | ^ < > new-line space tab

 

উদাহরণ, * বা ? চিহ্ন প্রিন্ট করার জন্য যে কোড লিখব তা হল,


#!/bin/sh 
echoHello;Word

 

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


Hello
./test.sh: line2:Word: commandnot found 
shell returned127

 

এখন একটি কোটেড ক্যারেক্টার ব্যবহার করে দেখা যাক,


#!/bin/sh 
echoHello\;Word

 

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


Hello;Word

 

$ একটি মেটাক্যারেক্টার তাই সেলের ব্যতিক্রমী আচরণ এড়াতে একে কোটেড অবস্থায় রাখতে হবে,


#!/bin/sh 
echo"I have \$1200"

 

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


I have $1200

 

চার ধরণের কোটিং দেখা যায়,

কোটিং বর্ণনা
Single quote এই কোটের মধ্যবর্তী বিশেষ ক্যারেক্টার তাদের বিশেষ অর্থ হারায়
Double quote এই কোটের মধ্যবর্তী বেশিরভাগ বিশেষ ক্যারেক্টার তাদের বিশেষ অর্থ হারায়,ব্যতিক্রমগুলো হল,

  • $
  • `
  • \$
  • \’
  • \”
  • \\
Backslash ব্যাকস্লেসকে অনুসরণ করা কোনও ক্যারেক্টার তাদের বিশেষ অর্থ হারায়
Back Quote ব্যাককোটের মধ্যবর্তী যেকোনো কিছুই কম্যান্ড, এগুলোকে সম্পাদন করা হয়

 

সিঙ্গেল কোট

একটি ইকো কম্যান্ড চিন্তা করা যাক যেটিতে অনেকগুলো সেল কম্যান্ড আছে।


echo<-$1500.**>;(update?)[y|n]

 

এর প্রত্যেকটি স্পেশাল ক্যারেক্টারের সামনে ব্যাকস্লেস দেয়া শ্রান্তিজনক ও পড়া কঠিন করে ফেলতে পারে।


echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]

 

এরকম বড় ক্যারেক্টার গ্রুপকে কোটিং করার একটি সহজ উপায় আছে। স্ট্রিংএর শুরু আর শেষে একটি করে সিঙ্গেল কোট ( ‘) দিতে হবে,


echo'<-$1500.**>; (update?) [y|n]'

 

আউটপুট হবে এমন স্ট্রিংএ সিঙ্গেল কোট বসলে পুরো স্ট্রিংকে সিঙ্গেল কোটে রাখার বদলে নিচের উদাহরণের মত করে ব্যাকস্লেস ব্যবহার করতে হবে,


echo'It\'s Shell Programming'

 

ডাবল কোট

নিচের সেল স্ক্রিপ্ট চেষ্টা করে দেখা যাক, এটি সিঙ্গেল কোটের আচরণ দেখাবে,


VAR=ZARA
echo'$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'

 

যার ফলাফল,


$VAR owes<-$1500.**>;[as of(`date +%m/%d`)]

 

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


VAR=ZARA
echo"$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"

 

এতে করে যে ফলাফল আসবে তা হল,


ZARA owes<-$1500.**>;[as of(07/02)]

 

ডাবল কোট সব ক্যারেক্টারের স্পেশাল মিনিং নিয়ে নেয় কিছু ব্যতিক্রম ছাড়া

  • প্যারামিটারসাবস্টিটিউশনের জন্য $
  • কম্যান্ড সাবস্টিটিউশনের জন্য ব্যাককোট
  • লিটারেল ডলার সাইনের অনুমোদনের জন্য \$
  • লিটারেল ব্যাককোট অনুমোদনের জন্য \`
  • এমবেডেড ডাবল কোট অনুমোদনের জন্য \”
  • এমবেডেড ব্যাকস্লেস অনুমোদনের জন্য \\
  • অন্য সব \ ক্যারেক্টার স্পেশাল নয়

 

ব্যাক কোট

ব্যাক কোটের মধ্যে সেল কম্যান্ড রাখলে তা সম্পাদন করা হয়, সেল কম্যান্ডকে ব্যাক কোটের মধ্যে রাখার সরল সিনট্যাক্স নিচের উদাহরণে,


var=`command`

 

যেমন, ডেট কম্যান্ড সম্পাদন করে এর ফলাফলকে ডাটা ভেরিয়েবলে রাখার জন্য,


DATE=`date` 
echo"Current Date: $DATE"

 

এটি নিচের ফলাফল প্রদর্শন করবে,


CurrentDate:ThuJul205:28:45 MST2009

 

ইউন্ডোজ ১০ রিলিজ ও কিছু অজানা তথ্য

Mr_An

প্রিয় পাঠক, সবাই ভালো আছেন আশা করি।

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

হ্যা আপনি ঠিক পড়ছেন আর আমিও ঠিকই লিখছি, ইউন্ডোজ ১০ পাওয়া যাবে বিনামূল্যে।

এক বছরের জন্য ইউন্ডোজ ১০ বিনামূল্যে আপডেট করা যাবে। কিন্তু এই সুবিধা শুধু তারাই পাবে যারা ইউন্ডোজ ৭,৮ ও ৮.১ এর যেকোনো ভার্সন ক্রয় করে ব্যবহার করছেন।

শুধু তাই নয়, গ্রাহক যাতে সহজে ইউন্ডোজের আপডেট পায়, সেজন্য মাইক্রোসফট কিছু নতুন পদ্ধতি ব্যবহার করবে ।

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

এই বছরে উইন্ডোজ ১০ রিলিজের পর, শোনা যাচ্ছে মাইক্রোসফট রেডস্টোন নামক নতুন আপডেটের জন্য কাজ শুরু করবে যা ২০১৬ নাগাদ রিলিজ করা হবে। নতুন ওই আপডেট রিলিজের মাধ্যমে ধারনা করা হচ্ছে উইন্ডোজ ১০ আরও অধিক ডিভাইস সাপোর্ট করতে সক্ষম হবে।

তো আপনারা সবাই তৈরি তো ইউন্ডোজ ১০ এর স্বাদ নেওয়ার জন্য।

ইউনিক্সঃ সেল সাবস্টিটিউশন (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 ] বিবৃতি সত্য