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

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

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

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

=比較してみると、特に違いはありませんか==

答え1

bash(その構文をコピーしたksh場所と同様)、比較ではなくパターンマッチングです。バイト間同等比較を実行する必要があります。どんなサポートでも。bash[[ $a == $b ]][[ $a == "$b" ]]===[[...]]

[[...]]標準構文ではありませんsh。これ[ 注文する標準で標準です比較する演算子が存在します=(一部の[実装では1も認識しますが==)。

すべてのコマンドの引数と同様に、変数拡張も引用符で囲む必要があります。分割+グローバル空の削除(後者のみで行われますzsh)なので、次のようになります。

[ "$a" = "$b" ]

標準では、shパターンマッチングは次の方法で行われますcase

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

完全性のために平等シェルスクリプトで出会える演算子:

  • [ "$a" -eq "$b" ][10進整数を比較するための標準演算子です。一部[の実装では、数字の周りにスペースを許可し、一部ではランダムな算術式を許可しますが、これは移植可能ではありません。ポータブルで人々が使用できます[ "$(($a))" -eq "$(($b))" ][ "$((a == b))" -ne 0 ]次の標準項目も参照してください(整数定数が含まれている$a場合にのみ動作を指定するPOSIXlyを除く$b)。

  • ((a == b))zshと にある ksh の はbashに格納された算術式が$aと同じ結果で評価される場合 true を返します$b。通常、数値を比較するために使用されます。算術式を評価する方法とサポートされている数には、シェルの間に違いがあります(例:bashとkshのいくつかの実装/バージョンは浮動小数点をサポートしないか、0の前の数字を8進数で処理しません)。

  • expr "$a" = "$b"両方のオペランドが10進整数として認識されている場合(一部は数字の周りに空白を許可する)、数値比較が実行され、そうでない場合、両方の文字列オペランドのソート順序が同じであることが確認されます。$aOR$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

また見なさい:


[1 GNUとの組み込み機能が含まれています。[たとえすべてがシェルとに基づいているわけではありませんが、kshbashyashashzshzsh=cmd特殊ファイル名拡張演算子です。(同じコンテキストで拡張されます)はそのコマンドのパスに拡張されるため、機能を無効にするオプションをオフにしない限り、それを作成する必要があり~userます。そうしないと、コマンドが見つからないというエラーが発生します。以下にも適用されます。equals[ "$a" '==' "$b" ]=[ "$string" '=~' "$regexp" ]

答え2

これは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:test、[、および[[の違いは何ですか?

答え3

どちら=もオペレータです==。一部の言語(Cなど)では、1つは変数に値を割り当てるために使用され、もう1つは値(算術式の結果)を比較するために使用されます。実際、これら2つの演算子は算術評価に使用される演算子とまったく同じです。 A$((a=23))は代入、a$((a==23))は算術比較です。

$ echo "$((a=11)) $((a==23))" "$((a=23))" "$((a==23))"
11 0 23 1

しかし、テスト構造内では(すべてテストそして[… ]そして[[...]])両方の演算子は同じ意味を持ち、同じことを行います。

したがって、すべてのオプションは次のようになります。

test "$a" =  "$b"
   [ "$a" =  "$b" ]
  [[ "$a" =  "$b" ]]
test "$a" == "$b"
   [ "$a" == "$b" ]
  [[ "$a" == "$b" ]]

はい内部等価物強く打つバイナリ同一性(参照変数)をテストします。正しい変数が引用されていない場合は、パターンとして解釈され、それに応じて一致することができます。つまり、リテラル文字列ではなくパターンに一致させることができます。

引用符付き演算子\=とは\==test で使用しても同じです[…]。ただし、引用符付き演算子は\==内部的に失敗します[[…]]

他のシェルの場合、結果はさまざまです。正しい結果はY -(true false)でなければならず、0(true)および1(false)以外の終了コードはfailuresとして報告されます¤。一部のシェルは失敗します- -(終了コードは常に1です)。

                     | dash  ksh   bash  zsh   
  test a  =  "$b"    | Y -   Y -   Y -   Y -    
     [ a  =  "$b" ]  | Y -   Y -   Y -   Y -    
    [[ a  =  "$b" ]] | ¤ ¤   Y -   Y -   Y -    
  test a  == "$b"    | ¤ ¤   Y -   Y -   - -    
     [ a  == "$b" ]  | ¤ ¤   Y -   Y -   - -    
    [[ a  == "$b" ]] | ¤ ¤   Y -   Y -   Y -    
  test a \=  "$b"    | Y -   Y -   Y -   Y -    
     [ a \=  "$b" ]  | Y -   Y -   Y -   Y -    
    [[ a \=  "$b" ]] | ¤ ¤   Y -   - -   - -    
  test a \== "$b"    | ¤ ¤   Y -   Y -   Y -    
     [ a \== "$b" ]  | ¤ ¤   Y -   Y -   Y -    
    [[ a \== "$b" ]] | ¤ ¤   Y -   - -   - -

すべてのオプションはkshで機能し、引用符付き演算子は[[…]]bashとzsh(内部的に)で失敗し、引用符で囲まれていない演算子はzsh(外部的に)で失敗\=します。\==[[…]]

関連情報