বাশ ফর লুপের দুটি টাইপ উপলব্ধ। একটি in কীওয়ার্ড ব্যবহার করে ভ্যালুর লিস্টের সাথে, আরেকটি সি প্রোগ্রামিং-এর মতো সিনট্যাক্স ব্যবহার করে।
এই আর্টিকেল আমাদের চলমান বাশ টিউটোরিয়াল সিরিজের অংশ।
এটি বাশ ফর লুপের উভয় মেথড ব্যাখ্যা করে, এবং ১২টি ভিন্ন উদাহরণ দিয়ে দেখায় কীভাবে আপনার শেল স্ক্রিপ্টে বাশ ফর লুপ ব্যবহার করবেন।
এই আর্টিকেলটি বুকমার্ক করুন ভবিষ্যতের রেফারেন্সের জন্য, কারণ বাশ ফর লুপ উদাহরণসহ কীভাবে ব্যবহার করবেন সেটি জানার জন্য এই আর্টিকেলই একমাত্র রেফারেন্স।
মেথড ১: in কীওয়ার্ড ও ভ্যালুর লিস্ট ব্যবহার করে বাশ ফর লুপ
সিনট্যাক্স:
for varname in list do command1 command2 .. done
উপরের সিনট্যাক্সে:
for,in,doএবংdoneহলো কীওয়ার্ডlistহলো ভ্যালুর লিস্ট। লিস্টটি একটি ভেরিয়েবল হতে পারে যেটিতে স্পেস দিয়ে সেপারেটেড چندین ওয়ার্ড থাকে। যদিforস্টেটমেন্টেlistমিসিং থাকে, তবে এটি শেলে পাস করা পজিশনাল প্যারামিটার নেয়।varnameহলো যেকোনো বাশ ভেরিয়েবল নাম।
এই ফরম্যাটে, for স্টেটমেন্ট বডিতে এনক্লোজড কমান্ডগুলো এক্সিকিউট করে, লিস্টের প্রতিটি আইটেমের জন্য একবার। উদাহরণস্বরূপ, যদি ভ্যালুর লিস্টে ৫টি আইটেম থাকে, তবে ফর লুপ মোট ৫বার এক্সিকিউট হবে, লিস্টের প্রতিটি আইটেমের জন্য একবার। লিস্ট থেকে বর্তমান আইটেমটি প্রতিবার একটি ভেরিয়েবল varname-এ স্টোর হয়। এই varname ফর লুপের বডিতে প্রসেস করা যায়।
মেথড ২: সি-লাইক সিনট্যাক্স ব্যবহার করে বাশ ফর লুপ
ফর লুপের দ্বিতীয় ফরম "C" প্রোগ্রামিং ল্যাঙ্গুয়েজের ফর লুপের মতো, যেটিতে তিনটি এক্সপ্রেশন থাকে (ইনিশিয়ালাইজেশন, কন্ডিশন এবং আপডেশন)।
for (( expr1; expr2; expr3 )) do command1 command2 .. done
উপরের বাশ ফর কমান্ড সিনট্যাক্সে,
- প্রথম ইটারেশনের আগে,
expr1ইভ্যালুয়েট হয়। এটি সাধারণত লুপের জন্য ভেরিয়েবল ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। doএবংdoneএর মধ্যে সকল স্টেটমেন্ট বারবার এক্সিকিউট হয় যতক্ষণ নাexpr2এর ভ্যালুTRUEহয়।- লুপের প্রতিটি ইটারেশনের পর,
expr3ইভ্যালুয়েট হয়। এটি সাধারণত লুপ কাউন্টার ইনক্রিমেন্ট করতে ব্যবহৃত হয়।
নিচের ১২টি উদাহরণ দেখায় কীভাবে বাশ ফর লুপ বিভিন্নভাবে ব্যবহার করা যায়।
১. in কীওয়ার্ডের পর স্ট্যাটিক ভ্যালু
নিচের উদাহরণে, ভ্যালুর লিস্ট (Mon, Tue, Wed, Thu এবং Fri) সরাসরি in কীওয়ার্ডের পর দেওয়া হয়েছে বাশ ফর লুপে।
$ cat for1.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" done $ ./for1.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
সতর্কতা: ভ্যালুর লিস্ট কমা (Mon, Tue, Wed, Thu, Fri) দিয়ে সেপারেট করা উচিত নয়। কমাটি ভ্যালুর অংশ হিসেবে বিবেচিত হবে। অর্থাৎ Mon-র বদলে Mon, ভ্যালু হিসেবে ব্যবহার হবে নিচের উদাহরণের মত।
$ cat for1-wrong1.sh i=1 for day in Mon, Tue, Wed, Thu, Fri do echo "Weekday $((i++)) : $day" done $ ./for1-wrong1.sh Weekday 1 : Mon, Weekday 2 : Tue, Weekday 3 : Wed, Weekday 4 : Thu, Weekday 5 : Fri
সতর্কতা: ভ্যালুর লিস্ট ডবল কোটেশন-এ এনক্লোজ করা উচিত নয়। ("Mon Tue Wed Thu Fri")। যদি ডবল কোটেশন-এ এনক্লোজ করেন, তবে এটি একটি সিঙ্গেল ভ্যালু হিসেবে বিবেচিত হবে (৫টি আলাদা ভ্যালুর বদলে), নিচের উদাহরণের মত।
$ cat for1-wrong2.sh i=1 for day in "Mon Tue Wed Thu Fri" do echo "Weekday $((i++)) : $day" done $ ./for1-wrong2.sh Weekday 1 : Mon Tue Wed Thu Fri
২. in কীওয়ার্ডের পর ভেরিয়েবল ব্যবহার করে লিস্ট
ফর লুপে সরাসরি ভ্যালু দেওয়ার বদলে, আপনি ভ্যালুগুলো একটি ভেরিয়েবলে স্টোর করতে পারেন, এবং ফর লুপে in কীওয়ার্ডের পর সেই ভেরিয়েবলটি ব্যবহার করতে পারেন, নিচের উদাহরণের মত।
$ cat for2.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in $weekdays do echo "Weekday $((i++)) : $day" done $ ./for2.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
সতর্কতা: সেরা অভ্যাস হিসেবে, আপনাকে সবসময় বাশ ভেরিয়েবল কোট করতে হবে যখন আপনি সেটি রেফার করছেন। এই সেরা অভ্যাসের কিছু এক্সসেপশন আছে। এটি 그중 একটি। আপনি যদি এই ফর লুপে ভেরিয়েবলটি ডবল কোট করেন, তবে ভ্যালুর লিস্টটি একটি সিঙ্গেল ভ্যালু হিসেবে বিবেচিত হবে। অনেক মানুষ এই ট্র্যাপে পড়ে। সতর্ক থাকুন এবং ফর লুপে আপনার ভেরিয়েবল ডবল কোট করবেন না।
$ cat for2-wrong.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in "$weekdays" do echo "Weekday $((i++)) : $day" done $ ./for2-wrong.sh Weekday 1 : Mon Tue Wed Thu Fri
৩. লিস্ট স্পেসিফাই করবেন না; পজিশনাল প্যারামিটার থেকে পান
আপনি যদি বাশ ফর লুপে in কীওয়ার্ড ফলো করা কোনো ভ্যালুর লিস্ট স্পেসিফাই না করেন, তবে এটি পজিশনাল প্যারামিটার ব্যবহার করবে (অর্থাৎ শেল স্ক্রিপ্টে পাস করা আর্গুমেন্টগুলো)।
$ cat for3.sh i=1 for day do echo "Weekday $((i++)) : $day" done $ ./for3.sh Mon Tue Wed Thu Fri Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
সতর্কতা: আপনি যদি এই মেথড ব্যবহার করেন তবে সতর্ক থাকুন। আপনাকে ফর লুপে in কীওয়ার্ড ইনক্লুড করা উচিত নয়। আপনি যদি in কীওয়ার্ডটি কোনো ভ্যালু ছাড়া রেখে দেন, তবে এটি পজিশনাল প্যারামিটার ব্যবহার করবে না নিচের মত করে। এটি লুপের ভিতরে যাবে না। অর্থাৎ ফর লুপ কখনো এক্সিকিউট হবে না নিচের উদাহরণের মত।
$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri
নোট: আমাদের আগের আর্টিকেল রেফার করুন বাশ পজিশনাল প্যারামিটার বুঝতে।
৪. ইউনিক্স কমান্ড আউটপুট ব্যবহার করে in কীওয়ার্ডের পর লিস্ট ভ্যালু
আপনি যেকোনো UNIX / লিনাক্স কমান্ডের আউটপুট ব্যবহার করতে পারেন ফর লুপের লিস্ট ভ্যালু হিসেবে, কমান্ডটিকে ব্যাক-টিক ` ` দিয়ে এনক্লোজ করে নিচের মত করে।
$ cat for4.sh i=1 for username in `awk -F: '{print $1}' /etc/passwd` do echo "Username $((i++)) : $username" done $ ./for4.sh Username 1 : ramesh Username 2 : john Username 3 : preeti Username 4 : jason ..
৫. ফাইল ও ডিরেক্টরি লুপ করুন ফর লুপে
একটি স্পেসিফিক ডিরেক্টরির অধীনে ফাইল ও ডিরেক্টরি লুপ করার জন্য, শুধু সেটা ডিরেক্টরিতে cd করুন, এবং ফর লুপে * দিন নিচের মত করে।
নিচের উদাহরণ আপনার হোম ডিরেক্টরির অধীনে সকল ফাইল ও ডিরেক্টরি লুপ করবে।
$ cat for5.sh i=1 cd ~ for item in * do echo "Item $((i++)) : $item" done $ ./for5.sh Item 1 : positional-parameters.sh Item 2 : backup.sh Item 3 : emp-report.awk Item 4 : item-list.sed Item 5 : employee.db Item 8 : storage Item 9 : downloads
বাশ ফর লুপে * এর ব্যবহার লিনাক্স কমান্ড লাইনে ls কমান্ড (ও অন্যান্য কমান্ড) ব্যবহার করার समय ফাইল গ্লবিং-এর কনসেপ্টের মতো।
উদাহরণস্বরূপ, নিচের কমান্ড আপনার হোম ডিরেক্টরির অধীনে সকল ফাইল ও ডিরেক্টরি দেখাবে। এই কনসেপ্টটি উপরের for5.sh উদাহরণে ব্যবহৃত হয়েছে।
cd ~ ls *
নিচের কমান্ড /etc ডিরেক্টরির অধীনে a, b, c, অথবা d দিয়ে শুরু হওয়া সকল *.conf ফাইল দেখাবে।
$ ls -1 /etc/[abcd]*.conf /etc/asound.conf /etc/autofs_ldap_auth.conf /etc/cas.conf /etc/cgconfig.conf /etc/cgrules.conf /etc/dracut.conf
উপরের ls কমান্ডে ব্যবহৃত সেম আর্গুমেন্টটি বাশ ফর লুপেও ব্যবহার করা যায়, নিচের উদাহরণের মত।
$ cat for5-1.sh i=1 for file in /etc/[abcd]*.conf do echo "File $((i++)) : $file" done $ ./for5-1.sh File 1 : /etc/asound.conf File 2 : /etc/autofs_ldap_auth.conf File 3 : /etc/cas.conf File 4 : /etc/cgconfig.conf File 5 : /etc/cgrules.conf File 6 : /etc/dracut.conf
৬. ফর লুপ থেকে ব্রেক আউট করুন
আপনি break কমান্ড ব্যবহার করে ফর লুপ থেকে ব্রেক আউট করতে পারেন নিচের মত করে।
$ cat for6.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" if [ $i -eq 3 ]; then break; fi done $ ./for6.sh Weekday 1 : Mon Weekday 2 : Tue
৭. ফর লুপের টপ থেকে কন্টিনিউ করুন
নির্দিষ্ট কন্ডিশনে, আপনি ফর লুপের বাকি কমান্ডগুলো ইগনোর করতে পারেন, এবং লুপের টপ থেকে আবার কন্টিনিউ করতে পারেন (লিস্টের পরবর্তী ভ্যালুর জন্য), continue কমান্ড ব্যবহার করে নিচের মত করে।
নিচের উদাহরণ Sat এবং Sun-এ (WEEKEND) অ্যাড করে, এবং বাকি দিনগুলোর জন্য (weekday) অ্যাড করে।
$ cat for7.sh i=1 for day in Mon Tue Wed Thu Fri Sat Sun do echo -n "Day $((i++)) : $day" if [ $i -eq 7 -o $i -eq 8 ]; then echo " (WEEKEND)" continue; fi echo " (weekday)" done $ ./for7.sh Day 1 : Mon (weekday) Day 2 : Tue (weekday) Day 3 : Wed (weekday) Day 4 : Thu (weekday) Day 5 : Fri (weekday) Day 6 : Sat (WEEKEND) Day 7 : Sun (WEEKEND)
৮. সি প্রোগ্রাম সিনট্যাক্স ব্যবহার করে বাশ ফর লুপ
এই উদাহরণ বাশ ফর লুপের ২য় মেথড ব্যবহার করে, যা সি ফর লুপ সিনট্যাক্সের মতো। নিচের উদাহরণ বাশ সি-স্টাইল ফর লুপ ব্যবহার করে ৫টি র্যান্ডম নম্বর জেনারেট করে।
$ cat for8.sh for (( i=1; i <= 5; i++ )) do echo "Random number $i: $RANDOM" done $ ./for8.sh Random number 1: 23320 Random number 2: 5070 Random number 3: 15202 Random number 4: 23861 Random number 5: 23435
৯. ইনফিনিট বাশ ফর লুপ
আপনি যদি বাশ সি-স্টাইল ফর লুপে স্টার্ট, কন্ডিশন, এবং ইনক্রিমেন্ট না দেন, তবে এটি ইনফিনিট লুপ হয়ে যাবে। লুপ রোকতে Ctrl-C চাপতে হবে।
$ cat for9.sh i=1; for (( ; ; )) do sleep $i echo "Number: $((i++))" done
যেমন উপরে বললাম, এই বাশ ইনফিনিট ফর লুপ উদাহরণ থেকে বের হওয়ার জন্য Ctrl-C চাপুন।
$ ./for9.sh Number: 1 Number: 2 Number: 3
১০. বাশ সি-স্টাইল ফর লুপে কমা ব্যবহার
বাশ সি-স্টাইল লুপে, কন্ডিশনে ব্যবহৃত ভ্যালু ইনক্রিমেন্ট করার পাশাপাশি, আপনি অন্য কিছু ভ্যালুও ইনক্রিমেন্ট করতে পারেন নিচের মত করে।
বাশ সি-স্টাইল ফর লুপের ইনিশিয়ালাইজ সেকশন, এবং ইনক্রিমেন্ট সেকশনে, আপনি কমা দিয়ে সেপারেট করে একাধিক ভ্যালু রাখতে পারেন নিচের মত করে।
নিচের ফর লুপ মোট ৫বার এক্সিকিউট হয়, ভেরিয়েবল i ব্যবহার করে। কিন্তু ভেরিয়েবল j ৫ দিয়ে শুরু হয়, এবং লুপ প্রতিবার এক্সিকিউট হলে ৫ করে ইনক্রিমেন্ট হয়।
$ cat for10.sh for ((i=1, j=10; i <= 5 ; i++, j=j+5)) do echo "Number $i: $j" done $ ./for10.sh Number 1: 10 Number 2: 15 Number 3: 20 Number 4: 25 Number 5: 30
১১. in কীওয়ার্ডের পর নাম্বার রেঞ্জ
আপনি ফর লুপ in-এ ব্রেস এক্সপ্যানশন ব্যবহার করে নাম্বার রেঞ্জ দিয়ে লুপ করতে পারেন।
নিচের উদাহরণ ১০ বার লুপ করে ১ থেকে ১০ পর্যন্ত ভ্যালু ব্যবহার করে।
$ cat for11.sh for num in {1..10} do echo "Number: $num" done $ ./for11.sh Number: 1 Number: 2 Number: 3 Number: 4 Number: 5 ...
১২. ইনক্রিমেন্ট সহ নাম্বার রেঞ্জ in কীওয়ার্ডের পর
নিচের উদাহরণ ৫ বার লুপ করে ১ থেকে ১০ পর্যন্ত ভ্যালু, ২ করে ইনক্রিমেন্ট দিয়ে। অর্থাৎ ১ দিয়ে শুরু হয়, এবং ২ করে ইনক্রিমেন্ট করে ১০ পর্যন্ত পৌঁছায়।
$ cat for12.sh for num in {1..10..2} do echo "Number: $num" done $ ./for12.sh Number: 1 Number: 3 Number: 5 Number: 7 Number: 9
PS: এই আর্টিকেলটি ভবিষ্যতের রেফারেন্সের জন্য বুকমার্ক করা ভুলবেন না।