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

ব্যাশ লুপ মাস্টার করুন: For, While, এবং Until উদাহরণ ব্যাখ্যা

ব্যাশ লুপ মাস্টার করুন: For, While, এবং Until উদাহরণ ব্যাখ্যালুপিং স্টেটমেন্ট একটি প্রোগ্রামকে বারবার একটি স্টেটমেন্ট এক্সিকিউট করতে বাধ্য করতে ব্যবহৃত হয়। এক্সিকিউট হওয়া স্টেটমেন্টকে লুপ বডি বলা হয়।

লুপ तबতক এক্সিকিউট হয় যতক্ষণ না একটি কন্ট্রোলিং এক্সপ্রেশনের মান ০ হয়। কন্ট্রোলিং এক্সপ্রেশন যেকোনো স্কেলার ডেটা টাইপ হতে পারে।

শেল ল্যাঙ্গুয়েজও বেশ কিছু ইটেরেশন বা লুপিং স্টেটমেন্ট প্রদান করে। এই আর্টিকেলে আমরা কিছু উদাহরণ দিয়ে ব্যাশ যা লুপিং স্টেটমেন্ট প্রদান করে সেটা রিভিউ করব।

ব্যাশ নিচের তিন ধরনের লুপিং স্টেটমেন্ট সাপোর্ট করে

  1. For loop
  2. While loop
  3. Until loop

এই আর্টিকেল চলমান Bash Tutorial সিরিজের অংশ।

লুপ নেস্টেড হতে পারে। অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজের মতো, ব্যাশও break স্টেটমেন্ট সাপোর্ট করে বর্তমান লুপ থেকে বের হওয়ার জন্য, এবং continue স্টেটমেন্ট সাপোর্ট করে লুপ স্টেটমেন্টের পরবর্তী ইটেরেশন রিজিউম করার জন্য।

ব্যাশ For Loop – প্রথম পদ্ধতি

For লুপ সাধারণত তখন ব্যবহৃত হয় যখন ইটেরেশনের সংখ্যা ব্যাশ লুপে ঢুকার আগে জানা থাকে। ব্যাশ দুধরকম for loop সাপোর্ট করে। ব্যাশ for loop-এর প্রথম ফর্ম হলো:

for varname in list do commands ##Body of the loop done

উপরোক্ত সিনট্যাক্সে:

  • for, in, do এবং done হলো কিওয়ার্ড
  • List হলো যেকোনো লিস্ট যাতে আইটেমের তালিকা থাকে
  • varname হলো যেকোনো ব্যাশ ভেরিয়েবল নাম।

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

ব্যাশ For Loop উদাহরণ ১. সব জিপ ফাইল আনজিপ করা

নিচের উদাহরণটি রুট ডিরেক্টরিতে "*.zip*" ম্যাচ করা ফাইলগুলোর তালিকা বের করে, এবং জিপ ফাইল যেখানে আছে সেখানেই একটি নতুন ডিরেক্টরি তৈরি করে, এবং জিপ ফাইলের কন্টেন্ট আনজিপ করে।

# cat zip_unzip.sh #! /bin/bash # .zip থাকা ফাইলগুলো খুঁজুন for file in `find /root -name "*.zip*" -type f` do # .zip এক্সটেনশন স্কিপ করুন dirname=`echo ${file} | awk -F'.' '{print $1}'` # ডিরেক্টরি তৈরি করুন mkdir $dirname # জিপ ফাইল কপি করুন cp ${file} ${dirname} cd $dirname # নতুন তৈরি ডিরেক্টরি থেকে জিপ ফাইল আনজিপ করুন unzip ${dirname}/$(echo ${file##/*/}) done
  • এই উদাহরণে find কমান্ড ফাইলগুলোর তালিকা রিটার্ন করে, যেখান থেকে প্রতিটি ফাইল লুপ দিয়ে প্রসেস হবে।
  • প্রতিটি আইটেমের জন্য, এটি জিপ ফাইলের নামে ডিরেক্টরি তৈরি করে, জিপ ফাইল কপি করে নতুন ডিরেক্টরিতে, এবং সেখান থেকে আনজিপ করে।
  • echo স্টেটমেন্ট, echo ${file##/*/} আপনাকে শুধু ফাইলনেম দেবে পাথ ছাড়া।
# ./zip_unzip.sh Archive: /root/test2/test2.zip extracting: t1/p extracting: t1/q extracting: t1/r extracting: t1/s extracting: t1/t extracting: t1/u extracting: t1/v Archive: /root/test1/test1.zip extracting: t/a extracting: t/b extracting: t/c extracting: t/d extracting: t/e

ব্যাশ লুপের মতো, Awk-ও for loop এবং while loop প্রদান করে যেমন আমরা Awk While and For Loop আর্টিকেলে আলোচনা করেছিলাম।

ব্যাশ For Loop – দ্বিতীয় পদ্ধতি

for loop-এর দ্বিতীয় ফর্ম 'C' প্রোগ্রামিং ল্যাঙ্গুয়েজের for loop-এর মতো, যাতে তিনটি এক্সপ্রেশন (ইনিশিয়ালাইজেশন, কন্ডিশন এবং আপডেশন) থাকে।

for (( expr1; expr2; expr3 )) do commands done
  • উপরোক্ত ব্যাশ for কমান্ড সিনট্যাক্সে, প্রথম ইটেরেশনের আগে, expr1 ইভ্যালুয়েট হয়। এটি সাধারণত লুপের জন্য ভেরিয়েবল ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
  • do এবং done-এর মাঝপথে সকল স্টেটমেন্ট বারবার এক্সিকিউট হয় যতক্ষণ না expr2-এর মান TRUE হয়।
  • লুপের প্রতিটি ইটেরেশনের পর, expr3 ইভ্যালুয়েট হয়। এটি সাধারণত লুপ কাউন্টার ইনক্রিমেন্ট করতে ব্যবহৃত হয়।

নিচের উদাহরণটি n সংখ্যক র‍্যান্ডম নম্বর জেনারেট করে।

ব্যাশ For উদাহরণ ২. n র‍্যান্ডম নম্বর জেনারেট করা

$ cat random.sh #! /bin/bash echo -e "How many random numbers you want to generate" read max for (( start = 1; start <= $max; start++ )) do echo -e $RANDOM done $ ./random.sh How many random numbers you want to generate 5 6119 27200 1998 12097 9181

উপরোক্ত কোড স্নিপেটে, for loop ম্যাক্স সংখ্যকবার র‍্যান্ডম নম্বর জেনারেট করে। RANDOM একটি ইন্টারন্যাল ব্যাশ ফাংশন যা প্রতিটি আহ্বানে একটি র‍্যান্ডম ইন্টিজার রিটার্ন করে।

ব্যাশ While Loop

শেল প্রোগ্রামিং ল্যাঙ্গুয়েজ দ্বারা প্রদত্ত আরেকটি ইটেরেশন স্টেটমেন্ট হলো while স্টেটমেন্ট।

Syntax: while expression do commands done 

উপরোक्त while loop সিনট্যাক্সে:

  • while, do, done হলো কিওয়ার্ড
  • Expression হলো যেকোনো এক্সপ্রেশন যা স্কেলার ভ্যালু রিটার্ন করে
  • While স্টেটমেন্ট একটি কোড ব্লককে এক্সিকিউট করাতে থাকে যতক্ষণ না একটি প্রদত্ত কন্ডিশনাল এক্সপ্রেশন true হয়।

ব্যাশ While উদাহরণ ৩. একটি ফাইলে কন্টেন্ট লিখা

নিচের উদাহরণটি stdout থেকে ডেটা পড়ে এবং একটি ফাইলে লিখে।

$ cat writefile.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to create" read file while read line do echo $line >> $file done $ sh writefile.sh Enter absolute path of the file name you want to create /tmp/a while for until $ cat /tmp/a while for until

উপরের উদাহরণে, ইউজার থেকে ফাইলনেম পড়ে, এবং stdin থেকে ডেটার লাইনগুলো পড়ে প্রতিটি লাইনকে দিয়ে गये ফাইলনেমে অ্যাপেন্ড করে। EOF ইনপুট দিলে, read ফেইল করবে, তাই লুপটি সেখানে শেষ হয়।

আপনি যদি অনেক ব্যাশ স্ক্রিপ্ট লিখেন, তবে আপনি Vim এডিটরকে ব্যাশ আইডিই হিসেবে ব্যবহার করতে পারেন Vim bash-support প্লাগইন ব্যবহার করে যেমন আমরা পূর্বে আলোচনা করেছিলাম।

ব্যাশ While উদাহরণ ৪. একটি ফাইলের কন্টেন্ট পড়া

পূর্বের উদাহরণে, এটি stdout থেকে ডেটা পড়ে ফাইলে লিখে। এই উদাহরণে, এটি ফাইল কন্টেন্ট পড়ে এবং stdout-এ লিখে।

$ cat read.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to read" read file exec <$file # redirects stdin to a file while read line do echo $line done $ ./read.sh Enter absolute path of the file name you want to read /tmp/a while for until

এই উদাহরণে, এটি পড়ার জন্য ফাইলনেম নেয়, এবং exec ব্যবহার করে stdin কে একটি ফাইলে রিডাইরেক্ট করে। সেখান থেকে, সকল stdin সেটি ফাইল থেকে আসে, কিবোর্ড থেকে না। read কমান্ড stdin থেকে লাইন পড়ে, তাই while loop stdin পড়ে, EOF হওয়া পর্যন্ত।

ব্যাশ Until Loop

until স্টেটমেন্ট সিনট্যাক্স এবং ফাংশনে while স্টেটমেন্টের সাথে খুব সিমিলার। একমাত্র বাস্তব পার্থক্য হলো until স্টেটমেন্ট তার কোড ব্লক এক্সিকিউট করে যতক্ষণ না এর কন্ডিশনাল এক্সপ্রেশন false হয়, এবং while স্টেটমেন্ট তার কোড ব্লক এক্সিকিউট করে যতক্ষণ না এর কন্ডিশনাল এক্সপ্রেশন true হয়।

syntax: until expression do commands #body of the loop done 

উপরোক্ত bash until সিনট্যাক্সে:
where until, do, done are keywords
expression any conditional expression

ব্যাশ Until উদাহরণ ৫. লগফাইল মনিটর করা

এই উদাহরণটি লগফাইলের সাইজ মনিটর করে, একবার লগফাইলের সাইজ ২০০০ বাইটে পৌঁছালে, সেটির একটি কপি নেয়।

$ cat monitor.sh file=/tmp/logfile until [ $(ls -l $file | awk '{print $5}') -gt 2000 ] do echo "Sleeping for next 5 seconds" sleep 5 done date=`date +%s` cp $file "$file-"$date.bak $ ./monitor.sh Sleeping for next 5 seconds Sleeping for next 5 seconds $ ls -l /tmp/logfile* -rw-r--r-- 1 sss sss 2010 Jun 24 12:29 logfile -rw-r--r-- 1 sss sss 2005 Jun 24 16:09 logfile-1277474574.bak

until স্টেটমেন্ট লুপের বডি এক্সিকিউট করতে থাকে যতক্ষণ না কন্ডিশন true হয়। এই উদাহরণে কন্ডিশন হলো ফাইলের সাইজ ২০০০ বাইটের চেয়ে বড়, তাই ২০০০ বাইট পৌঁছালে ফাইলটি কপি করে।

আরও পড়ুন আমাদের পূর্বের Bash Array examples।

ব্যাশ Until উদাহরণ ৬. মেশিন চালু হওয়ার জন্য অপেক্ষা

এই উদাহরণটি ssh করার আগে মেশিন চালু হওয়ার জন্য অপেক্ষা করতে ব্যবহৃত হয়। until loop স্টেটমেন্টটি শুধু তখনই শেষ হবে যখন ping রেসপন্স দেবে।

$ cat mac_wait.sh #! /bin/bash read -p "Enter IP Address:" ipadd echo $ipadd until ping -c 1 $ipadd do sleep 60; done ssh $ipadd $./mac_wait.sh Enter IP Address:192.143.2.10 PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. --- 192.143.2.10 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. 64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms --- 192.143.2.10 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established. Are you sure you want to continue connecting (yes/no)? yes

Until loop কমান্ড লাইনে খুব উপযোগী, নির্দিষ্ট ইভেন্ট ঘটার জন্য অপেক্ষা করার একটি উপায় হিসেবে।


  1. Bash For Loop কমান্ড ব্যবহার করার পদ্ধতি

  2. আপনার জন্য ৬টি সেরা স্ট্যাটিক ওয়েবসাইট CMS

  3. Bash-এ ফাইল পড়া মাস্টার করুন: সেরা While-Loop টেকনিকসমূহ

  4. ৩টি আকর্ষণীয় কমান্ড-লাইন গেম দিয়ে দ্রুত ব্যাশ শিখুন