"जबकि:" का क्या अर्थ है?


27

मुझे पता है कि एक whileलूप क्या है। हालाँकि, मैंने केवल इसके साथ काम किया है:

while [condition]
while ![condition]
while TRUE (infinite loop)

कहाँ बयान के बाद whileहो गया है या तो TRUEया FALSE

एक शेल बिलिन कमांड है जिसका नाम है :। इसे डमी कमांड के रूप में वर्णित किया जाता है, लेकिन मुझे नहीं पता कि यह यहाँ भी ऐसा ही है, भले ही यह हो TRUEया हो FALSE। शायद यह कुछ अलग है, लेकिन क्या?


4
कमांड :कुछ भी नहीं करता है लेकिन हमेशा रिटर्न कोड के साथ बाहर निकलता है। 0. तो, यह वही था while true(यह मानते हुए कि आपके सिस्टम में एक trueनिष्पादन योग्य है)।
जॉन १०२४

@ John1024 यह तब तक शून्य होता है जब तक कि इसके तर्कों के मूल्यांकन में त्रुटि न हो, उदाहरण के लिए, एक पठनीय चर के लिए एक मान निर्दिष्ट करना।
Kusalananda

3
@ कुसलानंद हां, यदि :आज्ञा कभी निष्पादित नहीं होती है, तो यह वापस नहीं आएगी। हालांकि यह मेरी राय में अतिशयोक्तिपूर्ण है ।
HVD

जवाबों:


50

वाक्य रचना है:

while
  first list of commands
do
  second list of commands
done

जो लूप में कमांड्स की दूसरी सूची को चलाता है जब तक कि कमांड्स की पहली सूची (इसलिए उस सूची में अंतिम रन) सफल होती है।

आदेशों की उस पहली सूची में , आप [विभिन्न प्रकार के परीक्षण करने के लिए कमांड का उपयोग कर सकते हैं , या आप :अशक्त कमांड का उपयोग कर सकते हैं जो कुछ भी नहीं करता है और सफलता, या कोई अन्य आदेश लौटाता है।

while :; do cmd; done

cmdहमेशा की तरह और अधिक से अधिक रन :हमेशा सफलता देता है। वह हमेशा के लिए पाश है। आप trueइसे अधिक सुपाठ्य बनाने के बजाय आदेश का उपयोग कर सकते हैं :

while true; do cmd; done

लोग पसंद करते थे :जैसा :कि हमेशा बनाया गया था, जबकि true(बहुत समय पहले नहीं था, ज्यादातर गोले trueआजकल बनते हैं) was।

अन्य संस्करण जिन्हें आप देख सकते हैं:

while [ 1 ];  do cmd; done

ऊपर, हम [कमांड का परीक्षण करने के लिए कह रहे हैं कि क्या "1" स्ट्रिंग गैर-रिक्त है (इसलिए हमेशा सच है)

while ((1)); do cmd; done

C की ((...))नकल करने के लिए कोर्न / बैश / zsh सिंटैक्स का उपयोग करना while(1) { ...; }

या अधिक घुमावदार लोगों की तरह until false; do cmd; done, until ! true...

जिन्हें कभी-कभी इस तरह से अलियास किया जाता है:

alias forever='while :; do'

तो आप कुछ ऐसा कर सकते हैं:

forever cmd; done

कुछ लोगों को पता चलता है कि हालत आदेशों की एक सूची है। उदाहरण के लिए, आप लोग लिखते हैं:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

जब वे लिख सकते थे:

while
  cmd1
  cmd2
do
  cmd3
done

यह एक सूची होने के लिए समझ में आता है क्योंकि आप अक्सर ऐसी चीज़ों को करना चाहते हैं while cmd1 && cmd2; do...; doneजो कमांड सूचियाँ भी हैं।

किसी भी स्थिति में, ध्यान दें कि [यह किसी भी अन्य की तरह एक कमांड है (हालांकि यह आधुनिक बॉर्न-जैसे गोले में निर्मित है), इसका उपयोग केवल if/ while/ untilहालत सूचियों में नहीं किया जाना है , और उन शर्त सूचियों में नहीं है किसी भी अन्य कमांड से अधिक उस कमांड का उपयोग करने के लिए।


Ign :भी छोटा है और तर्कों को स्वीकार करता है (जो इसे अनदेखा करता है)। जबकि के व्यवहार trueया falseअनिर्दिष्ट यदि आप इसे किसी भी तर्क से पारित है। इसलिए एक उदाहरण के लिए कर सकते हैं:

while : you wait; do
  something
done

लेकिन, का व्यवहार:

until false is true; do
  something
done

अनिर्दिष्ट है (हालांकि यह अधिकांश शेल / falseकार्यान्वयन में काम करेगा )।


12

while :एक अनंत लूप है। :बस कुछ भी नहीं (सफलतापूर्वक) करता है।

इसलिए यदि आप चाहते हैं कि आपका खोल हमेशा के लिए बिना कुछ किए लटक जाए, तो आप इसे लिख सकते हैं

while :
do
    :
done

या ;newlines के बजाय एक ही पंक्ति में :while :; do :; done

while :आमतौर पर उपयोग किया जाता है यदि आप एक विशेष स्थिति के बिना बार-बार कुछ करना चाहते हैं। आप उपयोग कर सकते हैं continue, breakपाश के भीतर बयान इसे नियंत्रित करने के लिए या एक तरह पाश के अंत तक हालत स्थानांतरित करने के लिए do ... whileनिर्माण।


12

जो भी हो, उसके बाद के कथन को TRUE या FALSE होना चाहिए।

नहीं, स्थिति भाग में कमांड कोई भी कमांड (*) हो सकती हैसभी शेल कमांड का कुछ रिटर्न वैल्यू है, और whileलूप (साथ ही ifसशर्त) शून्य के रिटर्न वैल्यू को "सही" और अन्य सभी को "गलत" के रूप में लेते हैं। (* या कई आदेशों की सूची, अंतिम एक गणना)

के रूप में :, बैश के मैनुअल स्पष्ट रूप से बताता है कि उस की वापसी स्थिति क्या है:

: [arguments]
तर्कों का विस्तार करने और पुनर्निर्देशन से परे कुछ भी न करें। वापसी की स्थिति शून्य है।

helpनिर्मित और भी अधिक स्पष्ट है:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

s/any command/any sequence of commands/, जैसा कि स्टीफन स्पष्ट करता है।
टोबी स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.