2013-03-20 10 views
35

मैं जबकि पाश बैश दो शर्तों का उपयोग करता है में काम कर रहे, एक सरल पाने के लिए कोशिश कर रहा हूँ, लेकिन विभिन्न मंचों से कई अलग अलग वाक्य रचना कोशिश कर के बाद कई की स्थिति, मैं एक त्रुटि फेंक नहीं रोक सकता। यहाँ मैं क्या है:बैश पटकथा है, जबकि पाश

while [ $stats -gt 300 ] -o [ $stats -eq 0 ] 

मैं भी कोशिश की है:

while [[ $stats -gt 300 ] || [ $stats -eq 0 ]] 

... के साथ-साथ कई अन्य लोगों निर्माणों। मैं इस पाश जबकि $stats is > 300 या यदि $stats = 0 जारी रखना चाहते हैं।

उत्तर

81

सही विकल्प (सिफारिश के बढते क्रम में) कर रहे हैं:

# Single POSIX test command with -o operator (not recommended anymore). 
# Quotes strongly recommended to guard against empty or undefined variables. 
while [ "$stats" -gt 300 -o "$stats" -eq 0 ] 

# Two POSIX test commands joined in a list with ||. 
# Quotes strongly recommended to guard against empty or undefined variables. 
while [ "$stats" -gt 300 ] || [ "$stats" -eq 0 ] 

# Two bash conditional expressions joined in a list with ||. 
while [[ $stats -gt 300 ]] || [[ $stats -eq 0 ]] 

# A single bash conditional expression with the || operator. 
while [[ $stats -gt 300 || $stats -eq 0 ]] 

# Two bash arithmetic expressions joined in a list with ||. 
# $ optional, as a string can only be interpreted as a variable 
while ((stats > 300)) || ((stats == 0)) 

# And finally, a single bash arithmetic expression with the || operator. 
# $ optional, as a string can only be interpreted as a variable 
while ((stats > 300 || stats == 0)) 

कुछ नोट:

  1. [[ ... ]] और ((...)) अंदर पैरामीटर विस्तार का हवाला देते हुए वैकल्पिक है; यदि चर सेट नहीं है, -gt और -eq 0.

  2. का उपयोग $((...)) अंदर वैकल्पिक है की एक मूल्य के मान लेंगे, लेकिन यह का उपयोग करने से अनजाने में त्रुटियों से बचने के। यदि stats सेट नहीं है, तो ((stats > 300))stats == 0 समझेंगे, लेकिन (($stats > 300)) में सिंटेक्स त्रुटि का उत्पादन करेगा।

+0

बढ़िया जवाब, आश्चर्यजनक पूरी तरह से – jake9115

+0

ब्रावो। एक पोस्ट का जवाब देने के लिए एक क्लासिक तरीका। बहुत बढ़िया। मुझे लगता है कि आप उसी वाक्यविन्यास का उपयोग 'till' के साथ भी कर सकते हैं, हां? – SaxDaddy

+0

@SaxDaddy अधिक या कम, जब तक आप शर्तों को सही तरीके से अस्वीकार करने की देखभाल करते हैं: 'जबकि [foo -o bar] 'बन जाता है! [foo -o bar] ', लेकिन 'जबकि foo || बार 'तब तक बन जाता है! foo &&! bar'। – chepner

1

प्रयास करें:

while [ $stats -gt 300 -o $stats -eq 0 ] 

[test के लिए एक कॉल है। यह सिर्फ समूह के लिए नहीं है, अन्य भाषाओं में ब्रांड्स की तरह। अधिक जानकारी के लिए man [ या man test देखें।

+1

मेरा सुझाव है '[[' 'से अधिक ['। दूसरे उत्तर पर मेरी टिप्पणी देखें। – danfuzz

+0

यह उचित है। मैंने [] का उपयोग किया क्योंकि ओपी क्या उपयोग करने की कोशिश कर रहा था। मैंने दोनों सफलता के साथ उपयोग किया है। – drewmm

0

अतिरिक्त [] अपने दूसरे वाक्य रचना के बाहर अनावश्यक हैं, और संभवतः भ्रामक। आप उनका उपयोग कर सकते हैं, लेकिन यदि आपको अवश्य ही उनके बीच सफेद जगह की आवश्यकता हो।

वैकल्पिक रूप से:

while [ $stats -gt 300 ] || [ $stats -eq 0 ] 
+0

दरअसल, '[[आमतौर पर एक परीक्षण अभिव्यक्ति शुरू करने के लिए पसंदीदा अंतर्निहित है। पुराने एकल '[' वाक्यविन्यास पर इसके कई फायदे हैं। – danfuzz

संबंधित मुद्दे