शेल खोल का उपयोग करके एक स्ट्रिंग की तुलना करें


197

मैं एसएच शेल का उपयोग कर रहा हूं और मैं एक चर के मूल्य के साथ एक स्ट्रिंग की तुलना करने की कोशिश कर रहा हूं, लेकिन 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 ;

दूसरी बात, क्या हम इसे NULL या खाली स्ट्रिंग से मिला सकते हैं?


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

6
फिर से मतदान करना। उद्धृत डप्स बैश शेल के लिए होते हैं, एनीमिक श शेल नहीं जो कभी-कभी पॉज़िक्स शेल या डैश होते हैं।
jww

1
सहमत और इसलिए मतदान किया। shऔर bashके रूप में ही संबंध सहन Cऔर C++। भले ही पहले के लिए लिखा गया कोड दूसरे में मान्य है, लेकिन दूसरे के जवाबों पर पहले काम करने के लिए भरोसा नहीं किया जा सकता है।
btilly

जवाबों:


290

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

Sourcesystem="ABC"

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

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


2
यह उद्धृत करने ABCया करने के लिए आवश्यक नहीं है XYZ
15

29
अगर आपके वैरिएबल में जगह हो सकती है तो उद्धृत करना आवश्यक है।
विलियम एवरेट

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


36

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

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

सौभाग्य


नोट: यदि आप चर की तुलना कर रहे हैं, तो सुनिश्चित करें कि आप उपयोग करते हैं "$VAR"और बस नहीं$VAR
श्रीधर सरनोबत

22

मेरी भी यही समस्या थी, यह करो

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

व्हाट्सएप पर ध्यान दें। यह महत्वपूर्ण है कि आप =साइन के बाद और पहले इस मामले में एक व्हाट्सएप का उपयोग करें।

" अन्य तुलना ऑपरेटर " देखें।


1
Dockerfile में: / bin / sh: 1: [: =: अनपेक्षित ऑपरेटर
Holms

10

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


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

18
ध्यान दें कि ऑपरेटर ==प्रत्येक शेल पर काम नहीं करता है। =तार की तुलना करने के लिए उपयोग करने के लिए सही ऑपरेटर है, और ==कभी-कभी एक पर्यायवाची है।
ओमर डेगन

3

जिन 4 गोले का मैंने परीक्षण किया है, उनमें से और के लिए बिल्टइन ABC -eq XYZमें सही का मूल्यांकन करता है । अभिव्यक्ति गलत के तहत करने के लिए मूल्यांकन करता है और के लिए builtins और । में और , तार संख्यात्मक मूल्यों में बदल रहे हैं और बराबर हैं, क्योंकि वे दोनों 0. IMO कर रहे हैं, के लिए builtins के व्यवहार और गलत है, लेकिन के लिए कल्पना इस पर अस्पष्ट है। testzshksh/usr/bin/testdashbashkshzshkshzshtest


1
परीक्षण के लिए धन्यवाद। यही कारण है कि बॉर्न शेल लोकप्रिय है।
केमिन झोउ

zsh स्पष्ट रूप से आउटपुट : पूर्णांक अभिव्यक्ति [ या बिल्डिन टेस्ट का उपयोग करने के बाद अपेक्षित है । शायद आप मजबूर कर रहे हैं [[ जो दोनों का मूल्यांकन करता है क्योंकि स्ट्रिंग महत्वपूर्ण पूर्णांक नहीं हैं।
209 बजे कोड 933k

@ कोड 933k कौन सा संस्करण? मुझे आश्चर्य नहीं होगा अगर व्यवहार बदल गया है।
विलियम पर्ससेल

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