2012-06-01 11 views
103

में एक स्ट्रिंग की तुलना करें मैं एसएच खोल का उपयोग कर रहा हूं और मैं एक चर के मूल्य के साथ एक स्ट्रिंग की तुलना करने की कोशिश कर रहा हूं लेकिन if स्थिति हमेशा सत्य पर निष्पादित होती है। क्यूं कर?यूनिक्स

Sourcesystem="ABC" 

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

echo Sourcesystem Value is $Sourcesystem ; 

यहां तक ​​कि इस काम नहीं कर रहा:

Sourcesystem="ABC" 

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

echo Sourcesystem Value is $Sourcesystem ; 

दूसरे, हम इस एक शून्य या खाली स्ट्रिंग के साथ मिलान कर सकते हैं

यहाँ कुछ कोड है?

+0

बॉर्न में प्रथम शैल आप अतिरिक्त जरूरत नहीं है ';' जब मैं बोर्न शेल में स्क्रिप्ट चलाता हूं, तो यदि स्थिति गलत है। यह पहले चेतावनी देगा: [: एबीसी: पूर्णांक अभिव्यक्ति अपेक्षित है। आउटपुट है: "स्रोत सिस्टम एबीसी से मेल नहीं खाता है"। जैसा कि दूसरों द्वारा टिप्पणी की गई है, -ईक पूर्णांक तुलना के लिए प्रयोग किया जाता है। बोर्न शैल (#!/Bin/sh) में स्ट्रिंग तुलना के लिए एक समान बराबर चिह्न का उपयोग करें। आपके खोल को आपको पहले स्थान पर सही करना चाहिए था। –

उत्तर

46

-eq पूर्णांक की तुलना करने के लिए उपयोग किया जाता है। इसके बजाय = का उपयोग करें।

167

आप स्ट्रिंग तुलना के लिए = ऑपरेटर का उपयोग करना चाहिए:

Sourcesystem="ABC" 

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

man test का कहना है कि आप -z का उपयोग रिक्त स्ट्रिंग के लिए मैच के लिए।

+1

'एबीसी' या 'XYZ' उद्धृत करना आवश्यक नहीं है। – ceving

+8

यदि आपके चर में इसमें रिक्त स्थान हो सकता है तो उद्धरण आवश्यक है। –

+0

उस भाग को स्पष्ट करने के लिए उदाहरण को समायोजित करें @ विलियम एवरेट। –

5

-eq गणितीय तुलना ऑपरेटर है। तुलनात्मक रूप से मैंने स्ट्रिंग तुलना के लिए इसका उपयोग कभी नहीं किया है, == और != पर निर्भर करता है।

if [ 'XYZ' == 'ABC' ]; then # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both 
    echo "Match" 
else 
    echo "No Match" 
fi 
+5

ध्यान दें कि ऑपरेटर '==' प्रत्येक खोल पर काम नहीं करता है। '=' स्ट्रिंग की तुलना करने के लिए उपयोग करने के लिए सही ऑपरेटर है, और '==' कभी-कभी समानार्थी होता है। –

3

-eq पूर्णांक की तुलना करने के लिए खोल तुलना ऑपरेटर है। तारों की तुलना करने के लिए आपको = का उपयोग करने की आवश्यकता है।

+6

-1: '==' का उपयोग न करें। यह केवल गोले के सीमित सेट में मान्य है, और अनिर्दिष्ट व्यवहार का उत्पादन करेगा। –

1
4 गोले कि मैं परीक्षण किया है के

, ABC -eq XYZzsh और ksh के लिए test निर्मित में सही का आकलन। अभिव्यक्ति /usr/bin/test के तहत झूठी और dash और bash के लिए अंतर्निहित मूल्यांकन करती है। ksh और zsh में, तारों को संख्यात्मक मानों में परिवर्तित कर दिया गया है और वे दोनों 0 के बराबर हैं। आईएमओ, ksh और zsh के लिए बिल्टिन का व्यवहार गलत है, लेकिन test के लिए यह नमूना इस पर संदिग्ध है।

+0

परीक्षण के लिए धन्यवाद। यही कारण है कि बोर्न शैल लोकप्रिय है। डॉकरफाइल में –

11

मैं इस एक ही समस्या थी, इस

if [ 'xyz' = 'abc' ]; 
then 
echo "match" 
fi 

सूचना खाली स्थान के है। यह महत्वपूर्ण है कि आप इस मामले में = हस्ताक्षर के पहले और उससे पहले एक व्हाइटस्पेस का उपयोग करें।

"Other Comparison Operators" देखें।

+1

:/bin/sh: 1: [: =: अप्रत्याशित ऑपरेटर – holms

6

eq तुलना करने के लिए पूर्णांकों बराबर का उपयोग '=' के बजाय, उदाहरण प्रयोग किया जाता है:

if [ 'AAA' = 'ABC' ]; 
then 
    echo "the same" 
else 
    echo "not the same" 
fi 

सौभाग्य