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


196

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

ここにいくつかのコードがあります:

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


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

6
再開するための投票。引用されている重複はbashシェル用であり、PosixシェルまたはDashであることがある貧血のshシェル用ではありません。
JWW

1
同意し、投票しました。 shととbash同じ関係をC持ちC++ます。最初に書かれたコードは2番目に有効ですが、2番目の回答が最初の回答で機能することを信頼することはできません。
btilly

回答:


288

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

Sourcesystem="ABC"

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

man test-z空の文字列を照合するために使用すると言います。


2
ABCまたはを引用する必要はありませんXYZ
2016

29
変数にスペースが含まれている可能性がある場合は、引用符を付ける必要があります。
ウィリアムエヴェレット

1
その部分をより明確にするために例を調整しました@WilliamEverett。
パーLundbergの


36

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

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

幸運を


注:変数を比較する場合は、"$VAR"単純にではなく、必ず使用してください$VAR
SridharSarnobat20年

22

私はこれと同じ問題を抱えていました、これをしてください

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

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

その他の比較演算子」を確認してください。


1
Dockerfile内:/ bin / sh:1:[:=:予期しない演算子
holms 2017

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
オペレーター==はすべてのシェルで機能するとは限らないことに注意してください。=文字列を比較するために使用する正しい演算子==であり、同義語である場合もあります。
Omer Dagan 2015年

3

私がテストした4つのシェルのうち、組み込みのforとでABC -eq XYZtrueと 評価されます。式が偽の下に評価し、ための組み込みコマンドと。及び、文字列が数値に変換され、それらがIMO両方0であるので等しい、のための組み込みコマンドの動作していると誤っている、しかしの仕様は、この上で曖昧です。 testzshksh/usr/bin/testdashbashkshzshkshzshtest


1
テストしていただきありがとうございます。そのため、Bourneシェルが人気があります。
Kemin Zhou 2016

zshは明確に出力します[または組み込みテストを使用した後に期待される整数式。文字列は有意な整数ではないため、両方を0と評価する[[を強制している可能性があります。
code933k

@ code933kどのバージョン?振る舞いが変わっても驚かないでしょう。
WilliamPursell19年

@WilliamPursellのzsh 5.7.1
code933k
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.