বাশে লুপ n বার পুনরাবৃত্তি কিভাবে


9

আমার মতো দৃশ্যের নীচে রয়েছে:

if [file exists]; then
   exit   
elif
   recheck if file exist (max 10 times)
   if found exit else recheck again as per counter  
fi 

এটি শাঁসের একটি খুব প্রাথমিক বৈশিষ্ট্য। আপনি কি এটি গবেষণা করেছেন?
পেশেকে

হ্যাঁ. তবে আমার কোড থেকে প্রত্যাশিত আউটপুট পাচ্ছেন না। যতটা সম্ভব সংক্ষিপ্তভাবে লিখতে চান
রকি 86

1
@ পেছকে, ভাল, তাদের কমপক্ষে কী দরকার হবে, তিনটি মূল বৈশিষ্ট্য (লুপ, শর্তসাপেক্ষ, ফাইল পরীক্ষা করা, লুপ ভেঙে দেওয়া)। কমপক্ষে প্রশ্নটি যেমনটি ঠিক তেমন স্পষ্ট। যদিও এতে রকি যা চেষ্টা করেছিল তার স্কেচ থাকতে পারে তবে তারপরে যে কোনওভাবেই এটি পুরোপুরি পুনর্লিখন করবে। ;)
ilkkachu

উত্তর:


9

এই লুপটি করার অনেকগুলি উপায় রয়েছে।

সঙ্গে ksh93সিনট্যাক্স (এছাড়াও দ্বারা সমর্থিত zshএবং bash):

for (( i=0; i<10; ++i)); do
    [ -e filename ] && break
    sleep 10
done

কোনও পসিক্স-এর মতো শেলের জন্য:

n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
    n=$(( n + 1 ))
    sleep 10
done

দু'টি লুপ আবার ফাইলটির অস্তিত্ব পরীক্ষা করার আগে প্রতিটি পুনরাবৃত্তিতে 10 সেকেন্ড ঘুমায়।

লুপটি শেষ হয়ে গেলে, 10 বার দৌড়ানোর কারণে বা ফাইলটি উপস্থিত হওয়ার কারণে লুপটি বেরিয়ে গেছে কিনা তা নির্ধারণ করার জন্য আপনাকে শেষবারের জন্য ফাইলটির অস্তিত্বের জন্য পরীক্ষা করতে হবে।

আপনি যদি চান এবং যদি আপনার ইনোটিফাই-সরঞ্জামগুলিতে অ্যাক্সেস থাকে তবে আপনি sleep 10কলটি প্রতিস্থাপন করতে পারেন

inotifywait -q -t 10 -e create ./ >/dev/null

এটি বর্তমান ডিরেক্টরিতে কোনও ফাইল তৈরির ইভেন্ট ঘটতে অপেক্ষা করবে তবে এটি 10 ​​সেকেন্ড পরে শেষ হবে। প্রদত্ত ফাইলের নামটি উপস্থিত হওয়ার সাথে সাথে আপনার লুপটি প্রস্থান করবে (যদি এটি উপস্থিত হয়)।

সহ পুরো কোড, inotifywait( sleep 10যদি আপনি এটি না চান তবে প্রতিস্থাপন করুন ) এর মতো দেখতে পাবেন

for (( i=0; i<10; ++i)); do
    [ -e filename ] && break
    inotifywait -q -t 10 -e create ./ >/dev/null
done

if [ -e filename ]; then
    echo 'file appeared!'
else
    echo 'file did not turn up in time'
fi

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

1
@ ইলক্কাচু হ্যাঁ, এটি একটি ভাল ধারণা, তবে এখানে আমি কেবল inotifywaitএকটি ড্রপ-ইন প্রতিস্থাপন হিসাবে ব্যবহার করছি sleep
কুসালানন্দ

8

গণনাটি যদি পরিবর্তনশীল না হয় তবে আপনি ব্রেস সম্প্রসারণ ব্যবহার করতে পারেন:

for i in {1..10}   # you can also use {0..9}
do
  whatever
done

গণনাটি যদি পরিবর্তনশীল হয় তবে আপনি seqকমান্ডটি ব্যবহার করতে পারেন :

count=10
for i in $(seq $count)
do
  whatever
done

ফাইলটি পাওয়া না গেলে আমি লুপ করতে চাই (সর্বোচ্চ 10 বার)। যদি পাওয়া যায় তৃতীয়বারের মতো বলুন তবে সফলভাবে প্রস্থান করুন
Rocky86

@ রকি 86: এটি জেনিয়েড দ্বারা প্রস্তাবিত সমাধানটির বিরোধিতা করে না। শেষ অবধি কেউ আপনাকে গণনা করতে জোর করে না ....
ব্যবহারিক 1934428

আমি এটি পছন্দ করি$(seq $count)
কর্মী

0
n=0
until [ "$((n+=1))" -gt 10 ]
do    <exists? command exit
done
echo oh noes!

যদিও test -e file && exitআরও নমনীয়


প্রশ্ন চিহ্ন কেন? নোট করুন যে পুনর্নির্দেশগুলির লক্ষ্যবস্তু গ্লোবগুলির জন্য ব্যবহার শাঁসের মধ্যে পৃথক হয়।
স্টাফেন চেজেলাস

2
নোট করুন যে ফাইলটি খোলার পার্শ্ব প্রতিক্রিয়া রয়েছে, উদাহরণস্বরূপ ফিফোসের জন্য এটি বেশ খারাপ হতে পারে (উদাহরণস্বরূপ লিনাক্সে / dev / ওয়াচডগের সাথে একটি সিমিলিং দিয়ে আরও খারাপ)
স্টাফেন চেজেলাস

এমনকি বাশ-এও, যেখানে এটি এর মতো exists1বা অন্য কোনও ফাইলের সন্ধান করবে , এটি এখনও / যখন কোনও ম্যাচিং ফাইল খুঁজে না পাওয়া যায় তখন একগুচ্ছ ত্রুটি মুদ্রণ করে। (একাধিক ম্যাচ থাকলে এটিও ত্রুটিযুক্ত)) আমার পরীক্ষা করা অন্য কোনও শেল মনে হয় যে কোনও ক্ষেত্রে ত্রুটি দেয় ...
ইলক্কাচু

@িক্কাছু - হ্যাঁ বিন্দু ছিল বিন্দু। ত্রুটি ঘটলে, স্ক্রিপ্ট রিপোর্ট করে। স্টাডার যদি দমন করা উচিত তবে এটি দমন করুন done 2<>/dev/null। নেই bashযে স্ক্রিপ্টের করে? আমি ভেবেছিলাম এটি কেবল একটি -iপ্রাকৃতিক প্রেক্ষাপটে কার্যকর হয়েছে। এখনও, exists?একটি ফিলার নাম হিসাবে অনেক file। তবে হ্যাঁ, আমি পুনর্নির্দেশগুলিতে উদ্ধৃতিগুলি ঘৃণা করি - যদি স্ক্রু এত বেশি থাকে।
মাইকেজার্ভ

@ স্টাফেন - আসলে কোনও কারণ নেই। তবে হ্যাঁ, ফিফোস, অপঠনযোগ্য ... কেন আমি উল্লেখ করেছি test -e
মাইকজার্ভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.