web-dev-qa-db-ja.com

shシェルを使って文字列を比較する

私はSH Shellを使っていて、文字列と変数の値を比較しようとしていますが、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または空の文字列と照合できますか。

145
James Bond

文字列比較には=演算子を使用する必要があります。

Sourcesystem="ABC"

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

man testは、空の文字列を照合するために-zを使用することを示しています。

222
Mithrandir

-eqは整数を比較するために使用されます。代わりに=を使用してください。

59
Piotr Praszmo

eqは整数を比較するために使用されます代わりに等しい '='を使用します、例:

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

がんばろう

21
Qign20

私はこれと同じ問題を抱えていた、これを行う

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

空白に注意してください。この場合、=記号の前後に空白を使用することが重要です。

" 他の比較演算子 "をご覧ください。

15
Eswar Yaganti

-eqは整数を比較するためのシェル比較演算子です。文字列を比較するためには=を使う必要があります。

8
codaddict

-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
7
Jason

私がテストした4つのシェルのうち、ABC -eq XYZtestzshのためのksh組み込みでtrueと評価されます。この式は、/usr/bin/testおよびdashおよびbashの組み込み関数の下でfalseと評価されます。 kshzshでは、文字列は両方とも0であるため、数値に変換され、等しくなります。IMO、kshzshの組み込み関数の動作は正しくありませんしかし、testの仕様はこれについてあいまいです。

3
William Pursell