मेरे पास नीचे का परिदृश्य है जैसे:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
मेरे पास नीचे का परिदृश्य है जैसे:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
जवाबों:
इस लूप को करने के कई तरीके हैं।
ksh93
सिंटैक्स के साथ (द्वारा समर्थित zsh
और bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
किसी भी POSIX जैसे शेल के लिए:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
फिर से फ़ाइल के अस्तित्व का परीक्षण करने से पहले दोनों लूप प्रत्येक पुनरावृत्ति में 10 सेकंड सोते हैं।
लूप समाप्त होने के बाद, आपको यह पता लगाने के लिए फ़ाइल के अस्तित्व के लिए अंतिम बार परीक्षण करना होगा कि क्या लूप 10 बार चलने के कारण बाहर निकल गया या फ़ाइल प्रदर्शित होने के कारण।
यदि आप चाहते हैं, और यदि आपके पास inotify-tools का उपयोग है, तो आप 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
inotifywait
ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग कर रहा हूँ sleep
।
यदि गिनती एक चर नहीं है तो आप ब्रेस विस्तार का उपयोग कर सकते हैं:
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
$(seq $count)
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
हालांकि test -e file && exit
अधिक लचीला है
exists1
जैसे कि, यह अभी भी त्रुटियों का एक गुच्छा प्रिंट करता है यदि / जब एक मिलान फ़ाइल नहीं मिली है। (इसके अलावा अगर इसमें कई मैच हैं, तो यह त्रुटि है।) मेरे द्वारा परीक्षण किया गया कोई अन्य शेल किसी भी मामले में त्रुटियां देता है ...
done 2<>/dev/null
। क्या bash
वह स्क्रिप्टेड है? मैंने सोचा कि यह केवल एक -i
उदासीन संदर्भ में है। फिर भी, exists?
एक भराव नाम जितना है file
। लेकिन हाँ, मुझे रीडायरेक्ट में उद्धृत करने से नफरत है - अगर शिकंजा इतना ऊपर।
test -e
।