2010-11-06 13 views
390

में लॉजिकल या ऑपरेशन कैसे करें I मैं एक साधारण हालत जांच करने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।शैल स्क्रिप्टिंग

यदि $#0 के बराबर है या 1 से अधिक है तो हैलो कहें।

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then 
echo "$#" 
fi 
+0

वे दोनों मेरे लिए काम करते हैं। क्या आपने * शेबांग * लाइन में एक खोल निर्दिष्ट किया था? –

+1

@ जेसन मैं वास्तव में शेबांग लाइन भूल गया, लेकिन मैंने अभी इसके साथ इसका परीक्षण किया और यह काम नहीं किया। – Strawberry

+15

'>' sh/bash में आउटपुट रीडायरेक्शन है। अब आपके पास शायद '1' नाम की एक फ़ाइल है। – mark4o

उत्तर

683

यह काम करना चाहिए:

if [ "$#" == 0 ] || [ "$#" -gt 1 ] ; then 
echo "hello" 
fi 

मुझे यकीन है कि अगर यह अन्य के गोले में अलग है नहीं कर रहा हूँ, लेकिन आप < उपयोग करना चाहते हैं,>, तो आप उन्हें डबल कोष्ठक के अंदर इतने की तरह रखना होगा:

if (("$#" > 1)) 
... 
+2

मुझे यकीन नहीं है कि यह किसी अन्य खोल में अलग है लेकिन बैश में, यदि आप इसका उपयोग करना चाहते हैं> या <, तो आपको उन्हें डबल ब्रांडेसिस में रखना होगा: ("$ a" <"$ b ")) –

+1

@ डॉउग: ऐसा नहीं है कि यूनिक्स उनका उपयोग नहीं करता है, यह है कि बैश और मुझे पता है कि अन्य सभी गोले इनपुट/आउटपुट पुनर्निर्देशन के लिए उनका उपयोग करते हैं। – Cascabel

+14

'-eq' का उपयोग करें' == '। मैन टेस्ट –

6

आप कुछ इस तरह की कोशिश की है:

मुझे कोई सफलता के साथ निम्न सिंटैक्स की कोशिश की है लगता है कि sh समर्थन करता है "=="। तारों की तुलना करने के लिए स्ट्रिंग्स और -ईक की तुलना करने के लिए "=" का उपयोग करें।

man test 

अधिक जानकारी के लिए।

+0

का उपयोग करें हाँ, मेरे पास है। जब मैं एक भी तर्क करता हूं तब भी यह इको हैलो। – Strawberry

+0

बैश के साथ यह मेरे लिए काम करता है। –

43

इस कोड मेरे लिए काम करता:

#!/bin/sh 

argc=$# 
echo $argc 
if [ $argc -eq 0 -o $argc -eq 1 ]; then 
    echo "foo" 
else 
    echo "bar" 
fi 

मैं डॉन

if [ "$#" == 0 -o "$#" > 1 ] ; then 
echo "hello" 
fi 

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then 
echo "hello" 
fi 
+0

से अधिक के लिए विकल्प क्या है? Tihs के लिए आधिकारिक दस्तावेज कहां है? – Strawberry

+3

से अधिक के लिए '-gt' होना चाहिए। या बस इसे '[$ # -ne 1] 'के साथ बदलें। – mark4o

+0

ग्रेटर से बड़ा है, मेरा जवाब देखें। आधिकारिक दस्तावेज मानव परीक्षण में है क्योंकि जेब्रमैनेंट ने बताया है। –

25

यदि आप बैश निकास कोड स्थिति $ का उपयोग कर रहे हैं? चर के रूप में, यह यह करने के लिए बेहतर है:

if [ $? -eq 4 -o $? -eq 8 ] ; then 
    echo "..." 
fi 

क्योंकि अगर आप:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then 

या बदल $ के बाएं हिस्से? परिवर्तनीय, OR का सही हिस्सा मूल $ नहीं है? मूल्य।

+1

$ # स्क्रिप्ट को पारित तर्कों की संख्या देता है। सही उपयोग की जांच के लिए उपयोगी। यह प्रतीत नहीं होता है कि पूछताछ निकास कोड का उपयोग कर रहा है। – Centimane

1

Bash Reference Manual → 3.4.2 Special Parameters से

#
($ #) दशमलव में स्थितीय पैरामीटर की संख्या को विस्तृत करता है।

इसलिए, $# हमेशा 0 या एक बड़ा पूर्णांक होगा।

[ condition ] && {things if true} || {things if false} 
:

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1" 

इस सिंटैक्स का उपयोग करता:

तो अगर आप जब भी $# या तो 0 या 1 से बड़ा है कुछ करना चाहता हूँ, तुम बस अगर $# है या 1 नहीं है की जाँच करने के लिए है

+0

बाश में आप कुछ ऐसा कर सकते हैं: '[[-n $ ए]] && echo 1 || गूंज 2' –

+0

@ premek.v टिप्पणी के लिए धन्यवाद। मेरा जवाब बहुत बुरी तरह समझाया गया था, मैंने इसे आशा में संपादित किया कि यह विषय के लिए और अधिक प्रकाश डालता है। – fedorqui

12

कभी-कभी आप अन्यथा आप भी कई तर्क की तरह कोई त्रुटि मिलती है, डबल कोष्ठक उपयोग करने की आवश्यकता

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]] 
    then 
fi 
संबंधित मुद्दे