シェル比較での単一と二重の等号(=)の違いは何ですか?


28

内部の文字列を比較ifするには、二重角かっこを使用する必要があることをお読みください。いくつかの本が比較ができることを言う=。しかし、それでも動作し==ます。

#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
    echo "equal"
fi

間に差がある===の比較では?


4
ここにどこかに質問がありますか?もしそうなら、私はそれを見ていません。=以下のためです[==以下のためです[[
クリスダウン

@ChrisDownそれは絶対に真実ではありません。
xdavidliu

@xdavidliu細心の注意が必要ですか?理解できないPOSIXによれば、それは確か真実です。そのため、===(等式)[および==(パターンマッチング、引用を認識するセマンティクスで)を使用する必要があります[[help test対を参照してくださいhelp [[
クリスダウン

@ChrisDown多分私は「のために」が意味するものを誤解しています。「だけで動作する」手段「のためである」場合にあるため、そのコメントは、真実ではない[ foo == foo ] && echo foo確かに印刷しfooていることを示す、==作品と[。しかし、「〜のために」によって「と一緒に使用されることを意図されていた」という意味である場合、私はより少ない異議を持っています。
xdavidliu

@xdavidliuは、あなたが言及している特定の場合に「is for」は「POSIXで定義されている」という意味です。bashが便利なようにそれを受け入れることが起こるという理由だけで、それはお勧めしますという意味ではありません-あなたはとにかくポータビリティをeschewingしている場合、単に使用[[などトークン化、単語の分割、のかなり多くの微妙な理解を持っている最初の場所での...
クリスダウン

回答:


28

[[ $a == $b ]]比較ではなく、パターンマッチングです。[[ $a == "$b" ]]バイトごとの等値比較が必要です。(によって導入された)をサポートするシェル=と同じです。==[[...]]ksh

[[...]]標準のsh構文ではありません。この[ コマンドは標準であり、標準の比較演算子があります=(一部の[実装でも認識されます==)。

コマンドの引数と同様に、変数は引用符で囲む必要があります。

[ "$a" = "$b" ]

標準ではsh、パターンマッチングは次のように行われcaseます。

case $a in
  ($b) ...
esac

完全を期すために、シェルスクリプトで遭遇する可能性のある他の平等のような演算子:

  • [ "$a" -eq "$b" ][10進整数を比較する標準演算子。一部の[実装では、数値の周囲に空白を使用でき、一部では任意の算術式を使用できますが、移植性はありません。移植性があり、そのために使用できます[ "$((a))" -eq "$((b))" ]。以下[ "$((a == b))" -ne 0 ]の標準的な同等物(POSIXlyを除き、動作は整数定数$a$b含む場合のみ指定されます)も参照してください。
  • ((a == b))、kshからandにもzshありbash、に格納されている算術式の評価がの評価と$a同じ数になる場合、trueを返します$b。通常、これは数値の比較に使用されます。シェルには、算術式の評価方法とサポートされる数値に違いがあることに注意してください(たとえば、bashおよびkshの一部の実装/バージョンは、浮動小数点をサポートしていないか、先行ゼロを8進数として処理しません)。

  • expr "$a" = "$b"両方のオペランドが10進整数として認識される場合(数値の前後に空白を許可する場合もあります)、数値の比較を行います。それはまたの値のために失敗し$aたり$bしているexprなどの事業者(substr...

  • awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"$aおよび$bが数字(少なくとも10進整数と1.2、-1.5e-4などの浮動小数点数、先頭の末尾の空白は無視され、16進数、8進数、またはで認識されるものも認識されるstrtod())の場合、数値の比較が実行されます。それ以外の場合は、実装によっては、それはどちらかのバイトツーバイト文字列の比較、またはのためのようなものだかどうかで比較、および並べ替え同じ。exprstrcoll()$a$b

こちらもご覧ください:


13

これらはbashで同等です:

[[ $x == "$y" ]]
[[ $x = "$y" ]]
[ "$x" == "$y" ]
[ "$x" = "$y" ]

最初の2つの$ x変数は引用符で囲む必要はありません。Bashは、[内ではなく[内ではなく、単語分割とパス名展開を実行します。

$ x='a b'
$ [ -s $x ]
-bash: [: a: binary operator expected
$ [[ -s $x ]]
$ ls
$ [ a = * ]
-bash: [: a: unary operator expected
$ [[ a = * ]]
$ 

[[ $x = "$y" ]]文字列比較です[[ $x = $y ]]が、パターンマッチング式です。

$ y='a*'; [[ aa = "$y" ]]; echo $?
1
$ y='a*'; [[ aa = $y ]]; echo $?
0

-eqは整数でのみ使用することを意図しています:

$ [[ x.x -eq x.x ]]
-bash: [[: x.x: syntax error: invalid arithmetic operator (error token is ".x")
$ x=9; [[ "x" -eq 9 ]]; echo $?
0

BashFAQ / 031:も参照してください。テスト[と[[の違いは何ですか?

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