मुझे अर्धविराम और / या ब्रेसिज़ के सही संयोजन के साथ आने में परेशानी हो रही है। मैं ऐसा करना चाहूंगा, लेकिन कमांड लाइन से वन-लाइनर के रूप में:
while [ 1 ]
do
foo
sleep 2
done
मुझे अर्धविराम और / या ब्रेसिज़ के सही संयोजन के साथ आने में परेशानी हो रही है। मैं ऐसा करना चाहूंगा, लेकिन कमांड लाइन से वन-लाइनर के रूप में:
while [ 1 ]
do
foo
sleep 2
done
जवाबों:
while true; do foo; sleep 2; done
वैसे, यदि आप इसे कमांड प्रॉम्प्ट पर मल्टीलाइन (जैसा कि आप दिखा रहे हैं) के रूप में टाइप करते हैं और फिर एरो अप के साथ इतिहास को कॉल करते हैं, तो आप इसे एक ही लाइन पर सही ढंग से पंक्चर कर पाएंगे।
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist यदि आप बैश का उपयोग कर रहे हैं तो विकल्प ?
while true; do sh /Users/myuser/bin/vpn ; done
नींद की स्थिति का उपयोग करना भी संभव है। एक-लाइनर बनाने से अधिक साफ-सुथरी इम्हो दिख रही है।
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done बेशक अगर [जबकि] आदेश विफल रहता है, तो लूप बाहर निकलता है, इसलिए आपको करना होगा while echo thinking || true ; do sleep 2 ; doneलेकिन फिर आप वापस आ while true ; ...
बृहदान्त्र हमेशा "सच" होता है:
while :; do foo; sleep 2; done
: [arguments] कोई प्रभाव नहीं; आदेश तर्कों का विस्तार करने और किसी भी निर्दिष्ट पुनर्निर्देशन से परे कुछ भी नहीं करता है। एक शून्य निकास कोड वापस आ गया है।
आप सेमीकोलोन का उपयोग बयानों को अलग करने के लिए कर सकते हैं:
$ while [ 1 ]; do foo; sleep 2; done
आप untilकमांड का उपयोग भी कर सकते हैं :
until ((0)); do foo; sleep 2; done
ध्यान दें कि इसके विपरीत while, untilलूप के अंदर आदेशों को निष्पादित करेगा जब तक कि परीक्षण की स्थिति में बाहर निकलने की स्थिति है जो शून्य नहीं है।
एक whileलूप का उपयोग करना :
while read i; do foo; sleep 2; done < /dev/urandom
एक forलूप का उपयोग करना :
for ((;;)); do foo; sleep 2; done
उपयोग करने का दूसरा तरीका until:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; doneकाम करने का मन नहीं करता। यह निरंतर अनंत है।
मुझे केवल WHILE स्टेटमेंट के लिए अर्धविराम का उपयोग करना पसंद है, और && ऑपरेटर को एक से अधिक काम करने के लिए लूप बनाना ...
इसलिए मैं हमेशा इसे ऐसे ही करता हूं
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
&&लूप का उपयोग किसी भी अन्य समय के रूप में ही है वास्तव में यह नहीं है। क्या आपको केवल दूसरी चीज की जरूरत है यदि पहला होता है, तो &&दूसरे का उपयोग करें ;। वास्तव में, आप उस लूप की सामग्री को छोटा और सरल रखना चाहते हैं, आदर्श रूप से केवल एक कमांड, इसलिए एक फ़ंक्शन या एक स्क्रिप्ट।
इसके watchबजाय सरल प्रक्रिया देखने के लिए उपयोग करें
का उपयोग कर while:
while true; do echo 'while'; sleep 2s; done
forलूप का उपयोग करना :
for ((;;)); do echo 'forloop'; sleep 2; done
का उपयोग करना Recursion, (ऊपर से थोड़ा सा अलग, कीबोर्ड इंटरप्ट इसे बंद नहीं करेगा)
list(){ echo 'recursion'; sleep 2; list; } && list;
यदि आप चाहते हैं कि लूप कुछ शर्त के बाद बंद हो जाए, और fooजब यह शर्त पूरी हो जाए, तो आपकी कमांड नॉन-जीरो हो जाए, तो आप लूप को इस तरह तोड़ सकते हैं:
while foo; do echo 'sleeping...'; sleep 5; done;
उदाहरण के लिए, यदि fooकमांड बैचों में चीजों को हटा रहा है, और यह 1 वापस आता है जब हटाने के लिए कुछ भी नहीं बचा है।
यह अच्छी तरह से काम करता है यदि आपके पास एक कस्टम स्क्रिप्ट है जिसे कुछ स्थिति तक कई बार कमांड चलाने की आवश्यकता होती है। 1जब स्थिति पूरी हो जाए और 0जब उसे फिर से चलाया जाए, तो उसके साथ बाहर निकलने के लिए आप स्क्रिप्ट लिखें ।
उदाहरण के लिए, मान लें कि आपके पास एक पायथन स्क्रिप्ट है, batch_update.pyजो एक डेटाबेस में 100 पंक्तियों 0को अपडेट करती है और 1यदि अपडेट करने के लिए और अधिक नहीं है तो वापस आती है। निम्नलिखित कमांड आपको अपडेट के बीच 5 सेकंड के लिए सोने के साथ एक बार में 100 पंक्तियों को अपडेट करने की अनुमति देगा:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
fooकोड के साथ आदेश से बाहर निकलें 1जब आप जबकि पाश को तोड़ने के लिए चाहते हैं। मैंने एक उदाहरण के साथ अपना जवाब अपडेट किया है।
अगर मैं दो व्यावहारिक उदाहरण दे सकता हूं (थोड़ा "भावना" के साथ)।
यह फ़ोल्डर "img" में ".jpg" के साथ समाप्त हुई सभी फाइलों का नाम लिखता है:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
यह उन्हें हटा देता है:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
बस योगदान देने की कोशिश कर रहा हूं।
ls -1 *.jpgऔरrm *.jpg
आप इसे भी आज़मा सकते हैं: यह आपको नहीं करना चाहिए, लेकिन चूंकि प्रश्न अनंत छोर के लिए पूछ रहा है, इसलिए यह नहीं है ... आप इसे कैसे कर सकते हैं।
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done