मुझे अर्धविराम और / या ब्रेसिज़ के सही संयोजन के साथ आने में परेशानी हो रही है। मैं ऐसा करना चाहूंगा, लेकिन कमांड लाइन से वन-लाइनर के रूप में:
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