লুপগুলির জন্য দুটি ধরণের ব্যাশ উপলব্ধ। একটি মানের তালিকা সহ "ইন" কীওয়ার্ড ব্যবহার করে, অন্যটি সিনট্যাক্সের মতো সি প্রোগ্রামিং ব্যবহার করে।
এই নিবন্ধটি আমাদের চলমান ব্যাশ টিউটোরিয়াল সিরিজের অংশ।
এটি লুপ পদ্ধতির জন্য ব্যাশ উভয়েরই ব্যাখ্যা করে এবং আপনার শেল স্ক্রিপ্টে লুপের জন্য ব্যাশ কীভাবে ব্যবহার করতে হয় তার 12টি ভিন্ন উদাহরণ প্রদান করে৷
ভবিষ্যত রেফারেন্সের জন্য এই নিবন্ধটিকে বুকমার্ক করুন, কারণ এটিই একমাত্র নিবন্ধ যা আপনি উদাহরণ সহ লুপের জন্য ব্যাশ কীভাবে ব্যবহার করতে হয় তা উল্লেখ করতে হবে।
পদ্ধতি 1:"ইন" এবং মানগুলির তালিকা ব্যবহার করে লুপের জন্য ব্যাশ
সিনট্যাক্স:
for varname in list do command1 command2 .. done
উপরের সিনট্যাক্সে:
- এর জন্য, ইন, ডু এবং ডন হল কীওয়ার্ড
- "তালিকা" মানের তালিকা ধারণ করে। তালিকাটি একটি পরিবর্তনশীল হতে পারে যাতে স্পেস দ্বারা পৃথক করা বেশ কয়েকটি শব্দ রয়েছে। যদি ফর স্টেটমেন্টে তালিকা অনুপস্থিত থাকে, তাহলে এটি শেলের মধ্যে পাস করা অবস্থানগত প্যারামিটারটি নেয়।
- varname হল যেকোনো Bash ভেরিয়েবলের নাম।
এই ফর্মে, for স্টেটমেন্ট তালিকার প্রতিটি আইটেমের জন্য একবার, একটি বডিতে আবদ্ধ কমান্ডগুলি চালায়। উদাহরণস্বরূপ, যদি মানের তালিকায় 5টি আইটেম থাকে, তাহলে লুপটি তালিকার প্রতিটি আইটেমের জন্য একবার মোট 5 বার কার্যকর করা হবে। তালিকা থেকে বর্তমান আইটেমটি লুপের মাধ্যমে প্রতিবার একটি পরিবর্তনশীল "বর্ণনাম" এ সংরক্ষণ করা হবে। এই "বর্ণনাম" ফর লুপের বডিতে প্রসেস করা যেতে পারে।
পদ্ধতি 2:সিনট্যাক্সের মতো সি ব্যবহার করে লুপের জন্য ব্যাশ
ফর লুপের দ্বিতীয় রূপটি "সি" প্রোগ্রামিং ভাষার জন্য লুপের অনুরূপ, যার তিনটি অভিব্যক্তি রয়েছে (সূচনা, শর্ত এবং আপডেট)।
<কেন্দ্র> কেন্দ্র>for (( expr1; expr2; expr3 )) do command1 command2 .. done
কমান্ড সিনট্যাক্সের জন্য উপরের ব্যাশে,
- প্রথম পুনরাবৃত্তির আগে, expr1 মূল্যায়ন করা হয়। এটি সাধারণত লুপের জন্য ভেরিয়েবল শুরু করতে ব্যবহৃত হয়।
- এক্সপ্র2 এর মান সত্য না হওয়া পর্যন্ত করা এবং সম্পন্ন করার মধ্যে সমস্ত বিবৃতি বারবার কার্যকর করা হয়৷
- লুপের প্রতিটি পুনরাবৃত্তির পরে, expr3 মূল্যায়ন করা হয়। এটি সাধারণত একটি লুপ কাউন্টার বৃদ্ধি করতে ব্যবহৃত হয়।
নিম্নলিখিত 12টি উদাহরণ দেখায় কিভাবে বিভিন্ন উপায়ে লুপের জন্য ব্যাশ করতে হয়।
1. "ইন" কীওয়ার্ডের পরে তালিকার জন্য স্ট্যাটিক মান
নিম্নলিখিত উদাহরণে, মানের তালিকা (সোম, মঙ্গল, বুধ, বৃহস্পতি এবং শুক্র) সরাসরি লুপের জন্য ব্যাশ-এ "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
সতর্কতা: মানের তালিকা কমা দ্বারা পৃথক করা উচিত নয় (সোম, মঙ্গল, বুধ, বৃহস্পতি, শুক্র)। কমাটিকে মানের অংশ হিসাবে গণ্য করা হবে। যেমন "সোম" এর পরিবর্তে, এটি "সোম" ব্যবহার করবে, যেমনটি নীচের উদাহরণে দেখানো হয়েছে।
$ 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
সতর্কতা: মান তালিকা একটি ডবল উদ্ধৃতি মধ্যে আবদ্ধ করা উচিত নয়. ("সোম মঙ্গল বুধ শুক্র")। আপনি যদি ডবল কোটে ঢোকেন, তাহলে এটিকে একটি একক মান হিসাবে গণ্য করা হবে (5টি ভিন্ন মানের পরিবর্তে), যেমনটি নীচের উদাহরণে দেখানো হয়েছে।
$ 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
2. "ইন" কীওয়ার্ডের পরে তালিকার জন্য পরিবর্তনশীল
সরাসরি ফর লুপে মান প্রদান করার পরিবর্তে, আপনি একটি ভেরিয়েবলে মানগুলি সংরক্ষণ করতে পারেন এবং "ইন" কীওয়ার্ডের পরে ফর লুপে ভেরিয়েবলটি ব্যবহার করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে৷
$ 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
3. তালিকা নির্দিষ্ট করবেন না; অবস্থানগত পরামিতি থেকে এটি পান
আপনি যদি লুপের জন্য bash-এ মানের কোনো তালিকার পরে “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" কীওয়ার্ডটি ছেড়ে দেন, তাহলে এটি নীচে দেখানো হিসাবে অবস্থানগত প্যারামিটার ব্যবহার করবে না। এটি লুপের ভিতরে যাবে না। অর্থাৎ for loop কখনই কার্যকর হবে না যেমন নিচের উদাহরণে দেখানো হয়েছে।
$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri
দ্রষ্টব্য :ব্যাশ পজিশনাল প্যারামিটার সম্পর্কে আরও বুঝতে আমাদের আগের নিবন্ধটি পড়ুন।
4. "ইন" কীওয়ার্ড
এর পরে তালিকা মান হিসাবে ইউনিক্স কমান্ড আউটপুটনীচে দেখানো হিসাবে ব্যাক-টিক `` এ কমান্ডটি ঘেরাও করে আপনি লুপের মানগুলির তালিকা হিসাবে যেকোনো UNIX/Linux কমান্ডের আউটপুট ব্যবহার করতে পারেন।
$ 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 ..
5. লুপের জন্য ফাইল এবং ডিরেক্টরির মধ্যে লুপ করুন
একটি নির্দিষ্ট ডিরেক্টরির অধীনে ফাইল এবং ডিরেক্টরিগুলি লুপ করতে, কেবলমাত্র সেই ডিরেক্টরিতে সিডি করুন এবং নীচের মতো লুপের জন্য * দিন।
নিম্নলিখিত উদাহরণটি আপনার হোম ডিরেক্টরির অধীনে সমস্ত ফাইল এবং ডিরেক্টরি লুপ করবে৷
$ 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 *
নিম্নলিখিতটি সমস্ত *.conf ফাইল প্রদর্শন করবে যা /etc ডিরেক্টরির অধীনে a, b, বা, c বা d দিয়ে শুরু হয়।
$ 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
6. লুপ থেকে বেরিয়ে আসুন
আপনি নিচের মতো 'ব্রেক' কমান্ড ব্যবহার করে লুপ থেকে বিরতি নিতে পারেন।
$ 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
7. লুপের উপরের দিক থেকে চালিয়ে যান
কিছু শর্তের অধীনে, আপনি লুপের বাকি কমান্ডগুলিকে উপেক্ষা করতে পারেন, এবং নীচের দেখানো হিসাবে অবিরত কমান্ড ব্যবহার করে আবার (তালিকার পরবর্তী মানের জন্য) থেকে লুপটি চালিয়ে যেতে পারেন৷
নিম্নলিখিত উদাহরণটি শনি ও সূর্যের সাথে "(সপ্তাহের শেষ)" এবং বাকি দিনগুলিতে "(সপ্তাহের দিন)" যোগ করে৷
$ 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)
8. সি প্রোগ্রাম সিনট্যাক্স ব্যবহার করে লুপের জন্য ব্যাশ
এই উদাহরণটি লুপের জন্য ব্যাশের 2য় পদ্ধতি ব্যবহার করে, যা লুপ সিনট্যাক্সের জন্য C এর অনুরূপ। নিচের উদাহরণটি লুপের জন্য ব্যাশ সি-স্টাইল ব্যবহার করে 5টি র্যান্ডম সংখ্যা তৈরি করে।
$ 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
9. লুপের জন্য অসীম ব্যাশ
আপনি যখন লুপের জন্য ব্যাশ সি-স্টাইলে শুরু, শর্ত এবং বৃদ্ধি প্রদান করবেন না, তখন এটি অসীম লুপে পরিণত হবে। লুপ বন্ধ করতে আপনাকে 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
10. লুপের জন্য ব্যাশ সি-স্টাইলে কমা ব্যবহার করা হচ্ছে
ব্যাশ সি-স্টাইল লুপে, কন্ডিশনে যে মানটি ব্যবহার করা হয় তা বৃদ্ধি করা ছাড়াও, আপনি নীচে দেখানো হিসাবে অন্য কিছু মানও বৃদ্ধি করতে পারেন।
ইনিশিয়ালাইজ সেকশনে, এবং লুপের জন্য ব্যাশ সি-স্টাইলের ইনক্রিমেন্ট সেকশনে, নিচের মত কমা দিয়ে আলাদা করে আপনি একাধিক মান রাখতে পারেন।
লুপের জন্য নিম্নলিখিতটি মোট 5 বার কার্যকর করা হয়েছে, ভেরিয়েবল i ব্যবহার করে। যাইহোক, ভেরিয়েবল j 5 দিয়ে শুরু হয় এবং প্রতিবার লুপ চালানোর সময় 5 দ্বারা বৃদ্ধি পায়।
$ 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
11. "ইন" কীওয়ার্ডের পরে সংখ্যার পরিসর
আপনি বন্ধনী সম্প্রসারণ ব্যবহার করে "ইন" লুপে সংখ্যার পরিসর ব্যবহার করে লুপ করতে পারেন।
নিম্নলিখিত উদাহরণ 1 থেকে 10 মান ব্যবহার করে 10 বার লুপ করে।
$ 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 ...
12. "ইন" কীওয়ার্ড
এর পরে বৃদ্ধি সহ সংখ্যার পরিসরনিম্নলিখিত উদাহরণটি 1 থেকে 10 মান ব্যবহার করে 5 বার লুপ করে, 2 এর বৃদ্ধি সহ। অর্থাৎ এটি 1 দিয়ে শুরু হয় এবং 10 এ না পৌঁছানো পর্যন্ত 2 দ্বারা বাড়তে থাকে।
$ 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: আপনার ভবিষ্যতের রেফারেন্সের জন্য এই নিবন্ধটি বুকমার্ক করতে ভুলবেন না।