लूप रहते हुए एक-लाइन बैश अनंत के लिए सिंटैक्स


633

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

while [ 1 ]
do
    foo
    sleep 2
done

4
सेमीकॉलन के साथ नई कहानियों को बदलें। छोरों के लिए भी यही काम करता है।
टॉम

23
@Tom: यह हमेशा काम नहीं करता है। करने के बाद, आपके पास पहला कमांड होना चाहिए, अर्धविराम नहीं
स्टेफानो बोरिनी

जवाबों:


1230
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

2
"यदि आप इसे कमांड प्रॉम्प्ट पर एक बहुस्तरीय (जैसा कि आप दिखा रहे हैं) के रूप में टाइप करते हैं और फिर इतिहास को एरो अप के साथ कॉल करते हैं, तो आपको इसे एक ही लाइन पर मिलेगा, सही ढंग से पंक्चर किया गया है।" मेरे लिए सच नहीं था।
विंसेंट स्कीब

@VincentScheib, जाँच करें cmdhist यदि आप बैश का उपयोग कर रहे हैं तो विकल्प ?
आलोक सिंघल

अति उत्कृष्ट! पूरी तरह से Mavericks (मैक ओएस-एक्स 10.9) पर काम करता है और मुझे एक वीपीएन चालू रखने की अनुमति देता है। एक खराब कुकी त्रुटि के साथ कुछ घंटों के बाद Openconnect डिस्कनेक्ट। इसलिए मैंने openconnect कमांड को एक शेल स्क्रिप्ट में रखा, sudo su रूट बनने के लिए, और इस cmd लाइन का उपयोग करें: while true; do sh /Users/myuser/bin/vpn ; done
Blisterpeanuts

170

नींद की स्थिति का उपयोग करना भी संभव है। एक-लाइनर बनाने से अधिक साफ-सुथरी इम्हो दिख रही है।

while sleep 2; do echo thinking; done

16
खैर यह सिंटैक्स को बदलने से अधिक है - यह नींद के बाद कमांड को निष्पादित करेगा । पिछले उत्तर में, कमांड को तुरंत निष्पादित किया जाता है। बस कुछ ध्यान देना है।
DanGordon

@DanGordon while echo thinking ; do sleep 2 ; done बेशक अगर [जबकि] आदेश विफल रहता है, तो लूप बाहर निकलता है, इसलिए आपको करना होगा while echo thinking || true ; do sleep 2 ; doneलेकिन फिर आप वापस आ while true ; ...
जाएंगे

69

बृहदान्त्र हमेशा "सच" होता है:

while :; do foo; sleep 2; done

15
क्यों बृहदान्त्र हमेशा सच है?
जुरगेन पॉल

8
समुद्र के नीचे @Peaeapple: बैश मैन पेज से: (SHELL BUILTIN COMMANDS अनुभाग में) : [arguments] कोई प्रभाव नहीं; आदेश तर्कों का विस्तार करने और किसी भी निर्दिष्ट पुनर्निर्देशन से परे कुछ भी नहीं करता है। एक शून्य निकास कोड वापस आ गया है।
एड्रियन डब्ल्यू

2
इस सिंटैक्स की अनुशंसा इस प्रकार की जाती है: शेल का ही हिस्सा है अर्थात: शेल बिलिन कमांड है।
17

@analytik तो आप कह रहे हैं कि प्लस या माइनस है? ;-)
ब्रायन कारिच

33

आप सेमीकोलोन का उपयोग बयानों को अलग करने के लिए कर सकते हैं:

$ while [ 1 ]; do foo; sleep 2; done

3
मुझे यह उत्तर पसंद है क्योंकि यह बताता है कि कब और क्यों; (अर्धविराम) की आवश्यकता है।
मिस्टर एंड्रियासजियो

29

आप 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काम करने का मन नहीं करता। यह निरंतर अनंत है।
0:30

11

एक बहुत ही सरल अनंत लूप .. :)

while true ; do continue ; done

Fr आपका प्रश्न यह होगा:

while true; do foo ; sleep 2 ; done

8

मुझे केवल 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

1
ठीक है, &&लूप का उपयोग किसी भी अन्य समय के रूप में ही है वास्तव में यह नहीं है। क्या आपको केवल दूसरी चीज की जरूरत है यदि पहला होता है, तो &&दूसरे का उपयोग करें ;। वास्तव में, आप उस लूप की सामग्री को छोटा और सरल रखना चाहते हैं, आदर्श रूप से केवल एक कमांड, इसलिए एक फ़ंक्शन या एक स्क्रिप्ट।
Thecoshman 13


6

का उपयोग कर 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;

5

यदि आप चाहते हैं कि लूप कुछ शर्त के बाद बंद हो जाए, और 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;

और तुम कैसे बाहर निकलोगे?
AK_

आप कर fooकोड के साथ आदेश से बाहर निकलें 1जब आप जबकि पाश को तोड़ने के लिए चाहते हैं। मैंने एक उदाहरण के साथ अपना जवाब अपडेट किया है।
Yep_It's_Me

2

अगर मैं दो व्यावहारिक उदाहरण दे सकता हूं (थोड़ा "भावना" के साथ)।

यह फ़ोल्डर "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

बस योगदान देने की कोशिश कर रहा हूं।


1
@JKnight - इन उदाहरणों के लिए, तो आप सिर्फ ऐसा नहीं करेंगे ls -1 *.jpgऔरrm *.jpg
केविन Fegan

2
दोनों अनंत लूप नहीं हैं और न ही लूप हैं।
मैरिएन

2

आप इसे भी आज़मा सकते हैं: यह आपको नहीं करना चाहिए, लेकिन चूंकि प्रश्न अनंत छोर के लिए पूछ रहा है, इसलिए यह नहीं है ... आप इसे कैसे कर सकते हैं।

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done

आप भी ऐसा क्यों करेंगे?
गनीउरफ_गनीउरफ

2
क्योंकि ब्रायन डेकोन जो सवाल पोस्ट करते थे, वह एक इनफिनिट लूप की तरह था। यह एक बिल्ली की त्वचा के लिए एक से अधिक तरीका है
grepit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.