Sh kabuğunu kullanarak bir dizeyi karşılaştırın


193

SH kabuğu kullanıyorum ve bir dizeyi bir değişkenin değeriyle karşılaştırmaya çalışıyorum, ancak ifkoşul her zaman doğru olarak yürütülür. Neden?

İşte bazı kodlar:

Sourcesystem="ABC"

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

echo Sourcesystem Value is  $Sourcesystem ;

Bu bile çalışmıyor:

Sourcesystem="ABC"

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

echo Sourcesystem Value is  $Sourcesystem ;

İkinci olarak, bunu bir NULL veya boş dizge ile eşleştirebilir miyiz?


İlk olarak Bourne kabuğunda fazladan ';' Komut dosyasını Bourne kabuğunda çalıştırmayı test ettiğimde, if koşulu yanlıştır. İlk olarak bir uyarı verecektir: [: ABC: tamsayı ifadesi bekleniyor. Çıktı: "Kaynak sistemi ABC ile eşleşmiyor". Başkalarının da yorumladığı gibi, -eq tamsayı karşılaştırmaları için kullanılır. Bourne kabuğunda dize karşılaştırması için tek bir eşittir işareti kullanın (#! / Bin / sh). Kabuğunuz ilk etapta sizi düzeltmiş olmalıydı.
Kemin Zhou

6
Yeniden açılması için oylama. Alıntı yapılan kopyalar, bazen bir Posix kabuğu veya Dash olan anemik sh kabuğu değil, bash kabuğu içindir.
jww

1
Kabul edildi ve oy verildi. shve bashaynı ilişkiyi ayı Cve C++. Birincisi için yazılan kod ikincide geçerli olsa da, ikincinin yanıtlarının ilkinde çalışacağına güvenilemez.
btilly

Yanıtlar:


283

=Dize karşılaştırması için operatörü kullanmalısınız :

Sourcesystem="ABC"

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

man test-zboş dizelerle eşleştirmek için kullandığınızı söylüyor .


2
ABCVeya alıntı yapmak gerekli değildir XYZ.
2016

29
Değişkeninizin içinde boşluklar varsa, alıntı yapmanız gerekir.
William Everett

1
Örneği daha net @ WilliamEverett yapmak için ayarladık.
Başına Lundberg


35

eq tamsayıları karşılaştırmak için kullanılır bunun yerine eşit '=' kullanın, örnek:

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

iyi şanslar


Not: Değişkenleri karşılaştırıyorsanız, "$VAR"basitçe değil kullandığınızdan emin olun$VAR
Sridhar Sarnobat

21

Aynı problemi yaşadım, bunu yap

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

Boşluğa dikkat edin. Bu durumda =işaretten sonra ve önce bir boşluk kullanmanız önemlidir .

" Diğer Karşılaştırma Operatörleri " ne bakın.


1
Dockerfile'da: / bin / sh: 1: [: =: beklenmeyen operatör
holms

10

-eqtam sayıları karşılaştırmak için kabuk karşılaştırma operatörüdür. Dizeleri karşılaştırmak için kullanmanız gerekir =.


5

-eqmatematiksel bir karşılaştırma operatörüdür. Bunu asla dize karşılaştırması için, güvenerek ==ve !=karşılaştırmalar için kullanmadım.

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
Operatörün ==her kabukta çalışmadığını unutmayın . =dizeleri karşılaştırmak için kullanılacak doğru operatördür ve ==bazen eşanlamlıdır.
Ömer Dağan

3

Test ettiğim 4 mermiden, ve ABC -eq XYZiçin testyerleşikte doğru olarak değerlendiriliyor . İfade yanlış under değerlendirir ve için builtins ve . İçinde ve , ipler sayısal değerleri haline dönüştürülür ve bunlar IMO hem 0 değerini çünkü vardır için builtins davranışını eşit ve hatalı olmakla birlikte, detaylı teknik bu konuda belirsizdir. zshksh/usr/bin/testdashbashkshzshkshzshtest


1
Test ettiğiniz için teşekkürler. Bourne kabuğu bu yüzden popülerdir.
Kemin Zhou

zsh açıkça çıktılar : [ veya yerleşik test kullanıldıktan sonra beklenen tamsayı ifadesi . Belki [[[[ her ikisini de 0 olarak değerlendirir çünkü dizeler anlamlı tamsayılar değildir .
code933k

@ code933k Hangi versiyon? Davranış değiştiyse şaşırmam.
William Pursell

@WilliamPursell zsh 5.7.1
kod933k
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.