ব্যাশ 'ফর' লুপ: টিউটোরিয়াল এবং উদাহরণ

Bash (Bourne Again Shell) হল GNU/Linux অপারেটিং সিস্টেমে একটি শেল কমান্ড প্রম্পট এবং স্ক্রিপ্টিং ভাষা। বেশিরভাগ লিনাক্স ডিস্ট্রিবিউশনের জন্য এটি ডিফল্ট শেল।

বেশিরভাগ স্ক্রিপ্টিং ভাষার মতো, ব্যাশ একই ধরনের কাজ একাধিকবার পুনরাবৃত্তি করার জন্য লুপ সিনট্যাক্স প্রদান করে। এই প্রবন্ধে, আমরা শিখব কিভাবে ব্যবহার করতে হয় জন্য বাশে লুপ।

ভূমিকা

একটি সাধারণ ব্যাশ স্ক্রিপ্টে একের পর এক চালানোর জন্য একাধিক কমান্ড থাকে। ভেরিয়েবলগুলি স্ট্রিং, ইন্টিজার ইনডেক্স মান, একটি কমান্ডের ফলাফল ইত্যাদি সঞ্চয় করতে ব্যবহার করা যেতে পারে। ব্যবহারকারী যখন একটি নির্দিষ্ট কমান্ড একাধিকবার কার্যকর করতে চায় তখন লুপের প্রয়োজন হয়। এটি বিশেষভাবে কাজে লাগে যখন একটি কমান্ডের আউটপুট একটি তালিকা আকারে থাকে এবং প্রতিটি ফলাফলে, তালিকায়, একটি দ্বিতীয় কমান্ড চালাতে হয়।

সাধারণ সিনট্যাক্স

জন্য সাধারণ বাক্য গঠন জন্য বাশে লুপ হল:

কাজ করার জন্য ... ... সম্পন্ন

এখানে একটি ব্যাশ ভেরিয়েবল, যেটি অবশ্যই একটি বৈধ লিনাক্স শেল ভেরিয়েবল নাম হতে হবে, অর্থাৎ, নামটিতে অক্ষর(az, AZ), সংখ্যা (0-9) এবং আন্ডারস্কোর (_ ) এর সংমিশ্রণ রয়েছে এবং এটি একটি অক্ষর দিয়ে শুরু হতে হবে বা একটি আন্ডারস্কোর

দ্য হয় পূর্ণসংখ্যা সূচকগুলির একটি কাস্টম পরিসর যা লুপ করা হবে বা পূর্ণসংখ্যা বা স্ট্রিংগুলির একটি কাস্টম তালিকা৷ এটিতে অন্য একটি লিনাক্স কমান্ডও থাকতে পারে, তবে, এই ধরনের কমান্ডের আউটপুট অবশ্যই স্পেস বা নিউলাইন অক্ষর দ্বারা আলাদা করা উচিত, যেমন, ব্যাশ দ্বারা একটি তালিকায় পার্সযোগ্য (ব্যাশের একটি তালিকা মূলত একটি স্থান বা একটি নতুন লাইন দ্বারা পৃথক করা মানগুলির একটি সংগ্রহ। )

যে কমান্ড(গুলি) কার্যকর করা হবে তা অবশ্যই এর ভিতরে স্থাপন করতে হবে কর... সম্পন্ন ব্লক

আসুন কয়েকটি সহজ উদাহরণ দেখি।

পূর্ণসংখ্যা মানের একটি পরিসীমা লুপিং: নিম্নলিখিত কোড dir1, dir2, dir3 পর্যন্ত dir10 নামে ডিরেক্টরি তৈরি করে।

আমি {1..10} এ mkdir dir$i করেছি

স্থির মানগুলির একটি তালিকা লুপ করা হচ্ছে: নিম্নলিখিত কোড প্রদত্ত নির্দিষ্ট তালিকার প্রতিটি স্ট্রিং বা পূর্ণসংখ্যা প্রিন্ট করে।

হ্যালো 1 2 3 বাই! প্রতিধ্বনি কর $আমি করেছি

একটি কমান্ডের আউটপুট লুপ করা: নিম্নলিখিত কোড আউটপুট উপর loops ls এবং প্রদত্ত বিন্যাসে প্রতিটি ফাইলের নাম প্রিন্ট করে।

i এর জন্য `ls` এ ইকো করবেন "ফাইলের নাম $i" হয়ে গেছে

অভিব্যক্তি ভিত্তিক সিনট্যাক্স

সি প্রোগ্রামিং ভাষার অনুরূপ একটি এক্সপ্রেশন-ভিত্তিক সিনট্যাক্স ব্যাশেও সম্ভব:

জন্য ((এক্সপ্রেশন 1; এক্সপ্রেশন 2; এক্সপ্রেশন 3)) do ... ... সম্পন্ন

এখানে, অভিব্যক্তি ঘ ইনডেক্স ভেরিয়েবলের প্রারম্ভিকতা। অভিব্যক্তি 2 সেই অবস্থা যখন লুপটি প্রস্থান করতে হবে; এই অবস্থা প্রতিটি পুনরাবৃত্তি চেক করা হয়. অভিব্যক্তি 3 সূচক ভেরিয়েবলের মান বৃদ্ধি/হ্রাস/পরিবর্তন নির্দিষ্ট করে

নিম্নলিখিত উদাহরণ সহজভাবে 0 থেকে 4 পর্যন্ত মান প্রিন্ট করে:

((i=0;i<5;i++)) এর জন্য ইকো $i সম্পন্ন করুন

নিম্নলিখিত উদাহরণ একটি অসীম লুপ তৈরি করে, যেহেতু কোন অভিব্যক্তি নির্দিষ্ট করা হচ্ছে না:

(; ; )) ইকো করার জন্য "স্টপ করতে Ctrl-C টিপুন" সম্পন্ন হয়েছে

বিরতি এবং চালিয়ে যান

শর্তসাপেক্ষ প্রস্থান জন্য বিবৃতি বিরতি

আমরা শর্তসাপেক্ষ বিবৃতিও ব্যবহার করতে পারি যদি লুপের ভিতরে। দ্য যদি বিবৃতি a এর সাথে ব্যবহার করা যেতে পারে বিরতি বিবৃতি, লুপ থেকে শর্তসাপেক্ষ প্রস্থানের জন্য।

((i=0;i<10;i++)) এর জন্য যদি [[ $i -eq 5 ]] করেন তাহলে break else echo $i; fi সম্পন্ন

উপরের লুপটি 0 থেকে 4 পর্যন্ত সংখ্যা প্রিন্ট করবে। তারপর i এর মান 5 হলে, এটি লুপ থেকে বেরিয়ে যাবে। যখন একটি কমান্ড একটি নির্দিষ্ট আউটপুট দেয় তখন লুপ থেকে প্রস্থান করতে হয় তখন এটি বিশেষভাবে কাজে লাগে। উদাহরণস্বরূপ, নিম্নোক্ত লুপটি যদি এবং যখন এটি একটি খালি ফাইল খুঁজে পায় তখন ভেঙে যায়।

ফাইলের জন্য `ls` do flen=`wc -c $file` যদি [[ "$flen" = "0 $file" ]] তাহলে echo "$file is empty" বিরতি না হলে echo $flen fi সম্পন্ন 

আদেশ wc -c ফাইলে লাইনের সংখ্যা প্রিন্ট করে . এটি ফরম্যাটে প্রিন্ট করে , উদাহরণ স্বরূপ, 10 test.txt. লাইনের সংখ্যা 0 হলে আমরা লুপ থেকে বেরিয়ে যাচ্ছি, অর্থাৎ একটি খালি ফাইল।

শর্তসাপেক্ষে একটি পুনরাবৃত্তি এড়ানোর জন্য বিবৃতি চালিয়ে যান

C এবং অন্যান্য অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজের মত, bash-এরও a আছে চালিয়ে যান বিবৃতি, একটি লুপে একটি পুনরাবৃত্তির অবশিষ্ট অংশ এড়িয়ে যাওয়ার জন্য যদি একটি নির্দিষ্ট শর্ত সন্তুষ্ট হয়।

((i=0;i<10;i++)) এর জন্য যদি [[ $i -eq 5 ]] করেন তাহলে fi echo $i চালিয়ে যান; সম্পন্ন

উপরের লুপটি 0 থেকে 10 পর্যন্ত সংখ্যা প্রিন্ট করবে, 5 ছাড়া, কারণ এর পুনরাবৃত্তির সময় i=5 একটি অবিরত বিবৃতি আছে, যা লুপে বাকি কোডটি বাদ দেবে এর পুনরাবৃত্তির সাথে শুরুতে i=6.

নিম্নলিখিত উদাহরণে, আমরা একটি ফাইলে লাইনের সংখ্যা প্রিন্ট করি এবং একটি নির্দিষ্ট পুনরাবৃত্তি হবে চালিয়ে যান যদি এটি একটি ডিরেক্টরি এবং একটি ফাইল না হয়।

`ls` এর ফাইলের জন্য যদি [[ -d $file ]] করেন তাহলে fi wc -c "$file" সম্পন্ন করা চালিয়ে যান

[[ -d $file ]] ফাইলটি একটি ডিরেক্টরি কিনা তা পরীক্ষা করে। যদি তা হয়, তাহলে আমরা পরবর্তী ফাইলে চলে যাই, অর্থাৎ পরবর্তী পুনরাবৃত্তি। যদি এটি একটি ডিরেক্টরি না হয়, আমরা ব্যবহার করে ফাইলের লাইন সংখ্যা মুদ্রণ wc কমান্ড, যেমন পূর্বে দেখানো হয়েছে।

লুপ ব্যবহার করা: স্ক্রিপ্ট এবং কমান্ড লাইন

লুপ সিনট্যাক্স ব্যাশ শেলে সরাসরি বা শেল স্ক্রিপ্ট ফাইল থেকে ব্যবহার করা যেতে পারে। একদা জন্য লুপ সিনট্যাক্স শেলে প্রবেশ করানো হয়, শেল ব্যবহারকারীকে লুপ করা কমান্ডগুলি চালিয়ে যেতে দেওয়ার জন্য প্রম্পট চালিয়ে যায়।

অন্যথায় ব্যবহারকারী এটি একটি স্ক্রিপ্ট ফাইলে সংরক্ষণ করতে পারে এবং স্ক্রিপ্ট ফাইলটি চালাতে পারে।

দ্য #!/bin/bash শুরুতে ফাইলটি কার্যকর করার সময় ব্যবহার করা ইন্টারপ্রেটারকে নির্দিষ্ট করে। যদিও বাশ আজকাল সর্বাধিক ব্যবহৃত শেল, কিছু ব্যবহারকারী শেল পছন্দ করেন zsh, যা এই ফাইলের শুরুতে bash-এর জায়গায় নির্দিষ্ট করা উচিত।

এক্সিকিউট পারমিশন দিতে এই ফাইলের জন্য, চালান:

chmod +x test.sh

অবশেষে, ফাইলটি চালানোর জন্য, চালান:

./test.sh

উপসংহার

দ্য জন্য লুপ ইন বাশ একটি খুব সাধারণ বৈশিষ্ট্য কিন্তু প্রায় প্রতিটি ধরণের জটিল স্ক্রিপ্টিং পরিস্থিতিতে এর ব্যবহার রয়েছে। আপনি একজন নিয়মিত বা উন্নত লিনাক্স ব্যবহারকারী, অথবা সিস্টেম অ্যাডমিনিস্ট্রেশন এবং DevOps কাজগুলির জন্য অটোমেশন শিখতে শুরু করুন না কেন এটি শেখা অনেক দূর এগিয়ে যায়।