मुझे कई शर्तों के साथ बैश में डू-लूप लूप लिखने में कुछ परेशानी हो रही है।

मेरा कोड वर्तमान में काम करता है जब यह इस तरह है:

    while
    count=$((count+1))
    ( MyFunction $arg1 $arg2 -eq 1 )
    do
       :
    done

लेकिन मैं "डू-जबकि" लूप में दूसरी शर्त जोड़ना चाहता हूं जैसे:

    while
    count=$((count+1))
    ( MyFunction $arg1 $arg2 -eq 1 ) || ( $count -lt 20 )
    do
       :
    done

जब मैं ऐसा करता हूं तो मुझे "कमांड नॉट एरर" मिलता है।

मैं इस पोस्ट से कुछ समय के लूप उदाहरणों का प्रयास कर रहा हूं लेकिन कोई भाग्य नहीं था और मेरे द्वारा उपयोग किए जाने वाले उदाहरण का उपयोग यहां. खासकर 137 लाइक्स के साथ जवाब।

0
Bobybobp 7 अक्टूबर 2019, 13:21

2 जवाब

सबसे बढ़िया उत्तर

( सिंटैक्स का हिस्सा है और $count मान्य कमांड नहीं है। test या [ एक मान्य कमांड है जिसका उपयोग अभिव्यक्तियों को "परीक्षण" करने के लिए किया जाता है।

while
   count=$((count+1))
   [ "$(MyFunction "$arg1" "$arg2")" -eq 1 ] || [ "$count" -lt 20 ]
do
   :
done

आप जिस उत्तर का उल्लेख करते हैं वह अंकगणितीय अभिव्यक्तियों का उपयोग करता है (( (एक भी नहीं (, लेकिन डबल (( के बीच कुछ भी नहीं)। आप यह भी कर सकते हैं:

while
   count=$((count+1))
   (( "$(MyFunction "$arg1" "$arg2")" == 1 || count < 20 ))
do
   :
done
2
chepner 7 अक्टूबर 2019, 15:47
मैं समझता हूं कि यह मेरे लिए क्यों काम करना चाहिए लेकिन मुझे समझ में नहीं आता कि इसका उपयोग करते समय मुझे सिंटैक्स त्रुटि क्यों मिलती है। मुझे एक त्रुटि मिलती है जैसे: -eq 1 || गिनती <20: अभिव्यक्ति में वाक्य रचना त्रुटि। इसके बाद मेरे फ़ंक्शन में त्रुटि टोकन होने का उल्लेख है, लेकिन ऐसा लगता है कि कोड पूरा होने तक चलता है।
 – 
Bobybobp
7 अक्टूबर 2019, 15:17
1
चूंकि bash की व्याख्या की जाती है, पार्सिंग और मूल्यांकन/निष्पादन कुछ हद तक समानांतर में चलते हैं। एक सिंटैक्स त्रुटि सिर्फ एक और रन-टाइम त्रुटि बन जाती है, और इसे एक विफलता के रूप में व्याख्या किया जाता है, ठीक उसी तरह जैसे कि एक कमांड वास्तव में चलती थी लेकिन एक गैर-शून्य निकास स्थिति थी।
 – 
chepner
7 अक्टूबर 2019, 15:49
स्पष्टीकरण के लिए धन्यवाद, मैंने आपके संपादन @chepner का उपयोग करके इसे फिर से आजमाया है और यह सिंटैक्स त्रुटि के बिना भी चलता है।
 – 
Bobybobp
7 अक्टूबर 2019, 15:54

आप for लूप का उपयोग कर सकते हैं:

for ((count=0; i<20 && $(MyFunction $arg1 $arg2) == 1; count++)); do
   echo $count
done
0
anubhava 7 अक्टूबर 2019, 13:25