2012-06-01 13 views
103

私はSHシェルを使用していますが、文字列と変数の値を比較しようとしていますが、ifの条件は常にtrueに実行されます。どうして?ここでUnixの文字列を比較する

はいくつかのコードです:

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または空の文字列でこれを一致させることができますか?

+0

まず、あなたが余分に必要としないシェル「;」 Bourneシェルでスクリプトをテストすると、if条件はfalseになります。最初に警告を出します:[:ABC:整数式が必要です。出力は「ソースシステムはABCと一致しません」と表示されます。他の人がコメントしたように、-eqは整数比較に使用されます。 Bourneシェル(#!/ bin/sh)の文字列比較には、等号を1つ使用してください。あなたのシェルはまずあなたを訂正したはずです。 –

答えて

46

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

167

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

Sourcesystem="ABC" 

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

man testあなたは、空の文字列を一致させるために-zを使用することを言います。

+1

'ABC'または' XYZ'を引用する必要はありません。 – ceving

+8

変数にスペースが含まれている場合は、引用が必要です。 –

+0

はその一部明確@WilliamEverettを作る例を調整しました。 –

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 XYZは、test組み込みのzshkshで真と評価されています。式は/usr/bin/testの下にfalseと評価され、dashbashの組み込み関数が評価されます。 kshzshでは、文字列が数値に変換され、これらは両方とも0 IMO、kshzshための組み込み関数の挙動が間違っているので等しいが、testの仕様は、この上で曖昧です。

+0

テストに感謝します。そういうわけで、Bourneシェルが人気があります。 Dockerfileの –

11

私はこの同じ問題を抱えていた、この

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

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

Other Comparison Operators」をチェックしてください。

+1

:/ bin/sh:1:[:=:unexpected operator – holms

6

当量の整数が等しい使用を比較するために使用される「=」の代わりに、 例:ボーン

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

幸運