मैं एक कमांड कैसे चला सकता हूं और कम वर्णों में इसका निकास कोड प्राप्त कर सकता हूं।


13

मैं अपनी स्क्रिप्ट इस तरह से लिखता था:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

इसने मुझे हमेशा परेशान किया कि मुझे some_commandदो बार लिखना है । क्या मैं इसे लूप टेस्ट सेक्शन के अंदर रख सकता हूं?

जवाबों:


20

आप some_commandअपनी परीक्षा की स्थिति के रूप में उपयोग कर सकते हैं।

while ! some_command; do sleep 1; done

जब तक some_commandकोई त्रुटि नहीं होगी, शर्त सही रहेगी ।

या अधिक वर्बोज़ तरीका यदि आप अतिरिक्त जाँच करना चाहते हैं:

while ! some_command
do 
    # add more if desired
    sleep 1
done

यह मेरा से बेहतर दिखता है, भले ही यह वन-लाइनर है ;-)
एंथन

ओपी इसे कई लाइनों में विभाजित करना चाह सकता है, हालांकि उसे विफलता पर कई आदेशों को निष्पादित करने की आवश्यकता होनी चाहिए, हालांकि :)
जॉन डब्ल्यूएच स्मिथ

कोई कारण नहीं कि आप इसे बहु-पंक्ति बनाने के लिए अर्ध-कॉलनों में लाइन-ब्रेक नहीं कर सकते।
मार्क स्टीवर्ट

1
... या लिखनाwhile ! some_command; do several; commands; sleep 1; done
इग्निस

12

यह वह है जिसके लिए untilलूप है:

until some_command
do    sleep 1
done

यह एक whileलूप का तार्किक निषेध है ।

कल्पना का कहना है:

untilलूप

  • untilपाश लगातार एक पर अमल करेगा यौगिक-सूची में लंबे समय के लिए एक और के रूप में के रूप में यौगिक-सूची एक गैर शून्य बाहर निकलने का दर्जा प्राप्त है।

  • जब तक लूप का प्रारूप इस प्रकार है:

    यौगिक-सूची -1 तक
    यौगिक-सूची -2 करें
    किया हुआ
  • यौगिक-सूची -1 क्रियान्वित किया जाएगा, और यह एक शून्य से बाहर निकलें स्थिति, यदि untilआदेश पूरा करता है। अन्यथा, यौगिक-सूची -2 निष्पादित की जाएगी, और प्रक्रिया दोहराती है।

4

आप बस कर सकते हैं:

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

इसका नुकसान यह है कि यह हमेशा एक सेकंड पहले सोता है

यदि आप 0 से बाहर निकलने के लिए किसी भी आदेश पर बाहर निकलने में सक्षम होना चाहते हैं, तो आप कर सकते हैं:

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

कौन सा कोर्स भी सिर्फ काम करता है some_command


5
दूसरे उदाहरण में शामिल नहीं होना चाहिए [और ]कमांड के आसपास।
nyuszika7h

2

न तो while ! ...है और न ही until ...प्रणाली है कि POSIX.1-2001 करने से पहले अपने खोल वातावरण सील कर दी पर काम करता है। यह, हालांकि, करता है।

while :; do
    if some command; then
        break
    fi
    sleep 1
done

यदि आपको कुल पोर्टेबिलिटी की आवश्यकता नहीं है, तो आप शेल स्क्रिप्ट क्यों लिख रहे हैं? पर्ल बैश की तुलना में उपलब्ध होने की अधिक संभावना है।

sleep 1 while 0 != system qw(some command);

(जैसा कि ऊपर है, sleepकेवल तभी निष्पादित किया जाता है जब कमांड विफल हो।)

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