POSIX शेल स्क्रिप्ट में… या जब तक… करें


17

प्रसिद्ध while condition; do ...; doneलूप है, लेकिन क्या कोई do... whileस्टाइल लूप है जो ब्लॉक के कम से कम एक निष्पादन की गारंटी देता है?


बहुत धन्यवाद शॉन, मुझे उम्मीद नहीं थी कि उत्तर इतनी जल्दी चयनित उत्तर बन जाएगा। इसलिए: चयन के लिए धन्यवाद।

जवाबों:


16

एक बहुत बहुमुखी संस्करण do ... whileइस संरचना है:

while 
      Commands ...
do :; done

एक उदाहरण है:

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

जैसा कि यह है (कोई मूल्य निर्धारित नहीं है i) लूप 20 बार निष्पादित होता है।
UN- टिप्पणी जो i16 पर सेट होती है i=16, लूप को 4 बार निष्पादित किया जाता है।
के लिए i=16, i=17, i=18और i=19

यदि मैं एक ही बिंदु (प्रारंभ) पर 26 को बताता हूं (चलो), कमांड को अभी भी पहली बार निष्पादित किया जाता है (जब तक कि लूप ब्रेक कमांड का परीक्षण नहीं किया जाता है)।

थोड़ी देर के लिए परीक्षण सत्य होना चाहिए (बाहर निकलने की स्थिति 0)।
परीक्षण को एक लूप के लिए उलट दिया जाना चाहिए, अर्थात: मिथ्या होना (निकास स्थिति नहीं 0)।

POSIX संस्करण को काम करने के लिए कई तत्वों की आवश्यकता है:

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 

इस बात को ध्यान में रखते हुए कि यदि आप किसी set -eभी चीज का उपयोग करते हैं, जबकि स्थिति ब्लॉक के निष्पादन को रोकने वाली नहीं है: जैसे set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> शिट होता है। इसलिए, यदि आप इसका उपयोग करते हैं, तो आपको त्रुटि से निपटने के लिए वास्तव में सावधान रहना होगा यानी चेन सभी कमांड के साथ &&!
तिमो

17

वहाँ नहीं है ... जबकि या करते हैं ... लूप तक, लेकिन एक ही चीज़ को इस तरह पूरा किया जा सकता है:

while true; do
  ...
  condition || break
done

जब तक:

until false; do
  ...
  condition && break
done

आप दोनों छोरों में से किसी भी ब्रेक लाइन का उपयोग कर सकते हैं - जब तक कि सच न हो या जब तक कि झूठ का अर्थ केवल 'हमेशा के लिए' न हो। मैं समझता हूँ कि यह थोड़े समय के लिए या जब तक नेस को बचाए रखता है, तब तक हालत खुश-एक्ज़िट या सैड-एग्ज़िट।
Android.weasel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.