লুপিং স্টেটমেন্টগুলি একটি প্রোগ্রামকে বারবার একটি বিবৃতি কার্যকর করতে বাধ্য করতে ব্যবহৃত হয়। সম্পাদিত বিবৃতিটিকে লুপ বডি বলা হয়।
একটি নিয়ন্ত্রক অভিব্যক্তির মান 0 না হওয়া পর্যন্ত লুপগুলি কার্যকর হয়৷ নিয়ন্ত্রক অভিব্যক্তিটি যে কোনও স্কেলার ডেটা টাইপ হতে পারে৷
শেল ভাষাটি বেশ কয়েকটি পুনরাবৃত্তি বা লুপিং বিবৃতিও প্রদান করে৷ এই নিবন্ধে আসুন আমরা লুপিং স্টেটমেন্ট পর্যালোচনা করি যা কিছু উদাহরণ ব্যবহার করে ব্যাশ প্রদান করে।
Bash তিন ধরনের লুপিং স্টেটমেন্টকে সমর্থন করে
- লুপের জন্য
- লুপ করার সময়
- লুপ পর্যন্ত
এই নিবন্ধটি চলমান ব্যাশ টিউটোরিয়াল সিরিজের অংশ।
লুপ নেস্ট করা যেতে পারে। অন্যান্য প্রোগ্রামিং ভাষার মতো, bash বর্তমান লুপ থেকে প্রস্থান করার জন্য ব্রেক স্টেটমেন্ট সমর্থন করে এবং লুপ স্টেটমেন্টের পরবর্তী পুনরাবৃত্তি পুনরায় শুরু করার জন্য স্টেটমেন্ট চালিয়ে যান।
লুপের জন্য ব্যাশ - প্রথম পদ্ধতি
ফর লুপগুলি সাধারণত ব্যবহৃত হয় যখন ব্যাশ লুপে প্রবেশ করার আগে পুনরাবৃত্তির সংখ্যা জানা যায়। ব্যাশ দুই ধরনের ফর লুপ সমর্থন করে। লুপের জন্য ব্যাশের প্রথম রূপ হল:
for varname in list do commands ##Body of the loop done
উপরের সিনট্যাক্সে:
<কেন্দ্র> কেন্দ্র>- জন্য, in, do এবং done হল কীওয়ার্ড
- তালিকা হল যে কোনও তালিকা যাতে আইটেমগুলির তালিকা রয়েছে
- varname হল যেকোনো Bash ভেরিয়েবলের নাম।
এই ফর্মে, for স্টেটমেন্ট তালিকার প্রতিটি আইটেমের জন্য একবার, একটি বডিতে আবদ্ধ কমান্ডটি কার্যকর করে। তালিকা থেকে বর্তমান আইটেমটি লুপের মাধ্যমে প্রতিবার একটি পরিবর্তনশীল "বর্ণনাম" এ সংরক্ষণ করা হবে। এই বর্ণনামটি লুপের বডিতে প্রসেস করা যায়। এই তালিকাটি এমন একটি পরিবর্তনশীল হতে পারে যাতে স্পেস দ্বারা পৃথক করা বেশ কয়েকটি শব্দ রয়েছে। যদি ফর স্টেটমেন্টে তালিকা অনুপস্থিত থাকে, তাহলে এটি শেলের মধ্যে পাস করা অবস্থানগত প্যারামিটার নেয়।
লুপের জন্য ব্যাশ উদাহরণ 1. সমস্ত জিপ ফাইল আনজিপ করুন
নিম্নলিখিত উদাহরণটি রুট ডিরেক্টরিতে “*.zip*”-এর সাথে মেলে এমন ফাইলগুলির তালিকা খুঁজে পায়, এবং যেখানে জিপ ফাইলটি বিদ্যমান সেখানে একটি নতুন ডিরেক্টরি তৈরি করে এবং জিপ ফাইলের সামগ্রী আনজিপ করে৷
# cat zip_unzip.sh #! /bin/bash # Find files which has .zip for file in `find /root -name "*.zip*" -type f` do # Skip the extension .zip dirname=`echo ${file} | awk -F'.' '{print $1}'` # Create the directory mkdir $dirname # Copy the zip file cp ${file} ${dirname} cd $dirname # Unzip the zip file from newly created directory unzip ${dirname}/$(echo ${file##/*/}) done
- এই উদাহরণে Find কমান্ড ফাইলগুলির তালিকা প্রদান করে, যেখান থেকে প্রতিটি ফাইল একটি লুপের মাধ্যমে প্রক্রিয়া করা হবে।
- প্রতিটি আইটেমের জন্য, এটি জিপ ফাইলের নামের সাথে ডিরেক্টরি তৈরি করে এবং নতুন তৈরি করা ডিরেক্টরিতে জিপ ফাইলটি কপি করে এবং সেখান থেকে জিপ ফাইলটিকে আনজিপ করে।
- ইকো স্টেটমেন্ট, 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 এছাড়াও লুপ এবং while লুপের জন্য প্রদান করে যেমনটি আমরা আমাদের Awk while এবং For Loop নিবন্ধে আলোচনা করেছি।
লুপের জন্য ব্যাশ - দ্বিতীয় পদ্ধতি
ফর লুপের দ্বিতীয় রূপটি ‘সি’ প্রোগ্রামিং ভাষার জন্য লুপের অনুরূপ, যার তিনটি অভিব্যক্তি (প্রাথমিকতা, শর্ত এবং আপডেট) রয়েছে।
for (( expr1; expr2; expr3 )) do commands done
- কমান্ড সিনট্যাক্সের জন্য উপরের ব্যাশে, প্রথম পুনরাবৃত্তির আগে, expr1 মূল্যায়ন করা হয়। এটি সাধারণত লুপের জন্য ভেরিয়েবল শুরু করতে ব্যবহৃত হয়।
- এক্সপ্র2 এর মান সত্য না হওয়া পর্যন্ত করা এবং সম্পন্ন করার মধ্যে সমস্ত বিবৃতি বারবার কার্যকর করা হয়৷
- লুপের প্রতিটি পুনরাবৃত্তির পরে, expr3 মূল্যায়ন করা হয়। এটি সাধারণত একটি লুপ কাউন্টার বৃদ্ধি করতে ব্যবহৃত হয়।
নিচের উদাহরণটি এলোমেলো সংখ্যার n সংখ্যা তৈরি করে।
উদাহরণ 2. এন এলোমেলো সংখ্যা তৈরি করুন
$ 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 লুপ সর্বোচ্চ সংখ্যায় র্যান্ডম সংখ্যা তৈরি করে। RANDOM হল একটি অভ্যন্তরীণ ব্যাশ ফাংশন যা প্রতিটি আহ্বানে একটি র্যান্ডম পূর্ণসংখ্যা প্রদান করে।
Bash while Loop
শেল প্রোগ্রামিং ভাষা দ্বারা প্রস্তাবিত আরেকটি পুনরাবৃত্তি বিবৃতি হল while স্টেটমেন্ট।
Syntax: while expression do commands done
উপরের while লুপ সিনট্যাক্সে:
- while, do, done হল কীওয়ার্ড
- এক্সপ্রেশন হল যে কোন এক্সপ্রেশন যা একটি স্কেলার মান প্রদান করে
- যদিও স্টেটমেন্টের কারণে কোডের একটি ব্লক কার্যকর করা হয় যখন প্রদত্ত শর্তাধীন অভিব্যক্তি সত্য হয়।
Bash while Example 3. একটি ফাইলে বিষয়বস্তু লিখুন
নিম্নলিখিত উদাহরণটি 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 প্রবেশ করে, তখন রিড ব্যর্থ হবে, তাই লুপটি সেখানেই শেষ হয়।
আপনি যদি অনেক ব্যাশ স্ক্রিপ্ট লেখেন, আপনি ভিম এডিটরকে ব্যাশ আইডিই হিসেবে ব্যবহার করতে পারেন ভিম ব্যাশ-সাপোর্ট প্লাগইন ব্যবহার করে যেমন আমরা আগে আলোচনা করেছি।
Bash while Example 4. একটি ফাইলের বিষয়বস্তু পড়ুন
আগের উদাহরণে, এটি 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 থেকে লাইন পড়ে, তাই যখন লুপ stdin পড়ে, EOF না হওয়া পর্যন্ত।
লুপ পর্যন্ত ব্যাশ করুন
সিনট্যাক্স এবং ফাংশনে while স্টেটমেন্টের সাথে এ পর্যন্ত বিবৃতিটি খুবই অনুরূপ। উভয়ের মধ্যে একমাত্র আসল পার্থক্য হল যে পর্যন্ত স্টেটমেন্ট তার কোড ব্লক কার্যকর করে যখন তার শর্তসাপেক্ষ অভিব্যক্তি মিথ্যা হয়, এবং যখন স্টেটমেন্ট তার শর্তসাপেক্ষ অভিব্যক্তি সত্য হয় তখন তার কোড ব্লক কার্যকর করে।
syntax: until expression do commands #body of the loop done
উপরের ব্যাশ এ পর্যন্ত সিনট্যাক্স:
কোথায় পর্যন্ত, ডু, ডন কীওয়ার্ড
যেকোন শর্তসাপেক্ষ অভিব্যক্তি প্রকাশ করে
উদাহরণ পর্যন্ত ব্যাশ 5. লগফাইল নিরীক্ষণ করুন
এই উদাহরণটি লগফাইলের আকার নিরীক্ষণ করে, একবার লগফাইলের আকার 2000বাইটে পৌঁছালে, এটি সেই লগফাইলের অনুলিপি নেয়৷
$ 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
শর্ত সত্য না হওয়া পর্যন্ত পর্যন্ত বিবৃতি লুপের বডি কার্যকর করতে থাকে। এই উদাহরণে শর্ত হল ফাইলের আকার 2000 বাইটের বেশি, তাই এটি 2000 বাইটে পৌঁছালে ফাইলটিকে কপি করে।
এছাড়াও, আমাদের আগের ব্যাশ অ্যারে উদাহরণগুলি উল্লেখ করতে ভুলবেন না৷
৷উদাহরণ 6 পর্যন্ত ব্যাশ। মেশিন আসার জন্য অপেক্ষা করা হচ্ছে
এই উদাহরণটি সেই মেশিনে ssh করার আগে মেশিনটি না আসা পর্যন্ত অপেক্ষা করতে ব্যবহৃত হয়। যখন পিং প্রতিক্রিয়া দেয় তখনই লুপ স্টেটমেন্ট শেষ হয়।
$ 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
যতক্ষণ না লুপ কমান্ড লাইনে বেশ উপযোগী, কিছু ঘটনা ঘটার জন্য অপেক্ষা করার উপায় হিসেবে।