条件式で「==」と「=」の違いは何ですか?

条件式で「==」と「=」の違いは何ですか?

bash マニュアルの条件式の場合

string1 == string2
string1 = string2

文字列が等しい場合は真です。

  1. このコマンドと組み合わせて使用​​すると、上記のように[[パターンマッチングが実行されます(10ページの3.2.4.2セクション「条件付き構造」を参照)。

    • ここで「パターンマッチング」とはどういう意味ですか?

    • ここで「パターンマッチング」は何に該当するのか?

    • [[「this」を他のコマンド以外のコマンドと一緒に使用するとどうなりますか?

  2. test'='はposixの一貫性のためのコマンドと一緒に使用する必要があります。

    • POSIXはここで何を言いますか?

    • 異議申し立ては何ですか?

    • コマンドを==使用できますか?test私はそれを試してみました。

    • この命令に加えて=他の命令と一緒に使用できますかtest?試してみましたが=効果があるようです。[[[

  3. ==これらとの違いは何ですか=

    Bash 4.3 では、 と とともに==and を使ってみました。私が見るのと同じようです。=test[[[===

    条件式で入れ替えて使用できますか===

ありがとうございます。

答え1

POSIXtest(または[ ... ])は1つの等号だけを知っています。

s1= s2 は、
文字列 s1 と s2 が等しい場合は真で、そうでなければ偽です。

しかし、Bashは二重等号も受け入れますが、組み込みのヘルプではこれを認めません(手動する):

$ help test | grep -A1 =
  STRING1 = STRING2
                 True if the strings are equal.
  STRING1 != STRING2
                 True if the strings are not equal.

他の殻は状況によって異なります。まあ、特にダッシュはここで最も頑固な人です。

$ dash -c '[ x == x ] && echo foo'
dash: 1: [: x: unexpected operator

しかし、

$ yash -c '[ x == x ] && echo foo'
foo
$ busybox sh -c '[ x == x ] && echo foo'
foo
$ ksh93 -c '[ x == x ] && echo foo'
foo

真ん中zsh=something一つですファイル名拡張子something演算子は、 にある場合、そのオプションがオフになっていない限り(たとえば、他のシェルをエミュレートするなど)、コマンドのパスに展開され、単純なコマンドの引数に適用されるか、適用$PATHされる場合にも適用されます。たとえば、少なくとも先行コマンドを引用する必要があります。 :equals===~test[=

$ zsh -c 'echo =ls'
/usr/bin/ls

$ zsh +o equals -c 'echo =ls'
=ls

$ zsh --emulate ksh -c 'echo =ls'
=ls

$ zsh -c '[ x == x ] && echo foo'
zsh:1: = not found

$ zsh -c '[ x "==" x ] && echo foo'
foo

私のDebianでGNU coreutilsの外部test/ utilサポート(しかし[==手動これを認めません。 OS Xではそうではありません。

したがって、test/を使用するときはより幅広くサポートされますので[ .. ]ご使用ください。=


とともに[[ ... ]]構造、およびは=すべて==同じで(少なくともBashでは)、演算子の右側が引用されない限り、ファイル名globと同様にパターンとして扱われます。 (ファイル名は内部的には拡張されません[[ ... ]]。)

$ bash -c '[[ xxx == x* ]] && echo foo'
foo

ただし、もちろんこの構成は標準ではありません。

$ dash -c '[[ xxx == x* ]] && echo foo'
dash: 1: [[: not found
$ yash -c '[[ xx == x* ]] && echo foo'
yash: no such command ‘[[’

Busyboxにはありますが、パターンマッチングは行いません。

$ busybox sh -c '[[ xx == xx ]] && echo yes || echo no'
yes
$ busybox sh -c '[[ xx == x* ]] && echo yes || echo no'
no

答え2

Bashには同等性のための4つの条件があります。

  • =内部(またはテスト済み)単純で基本的な(posix互換のみ)[ … ]
    2つの文字列の同等性(バイト単位)のみを実行します。

     STRING1 = STRING2
                 True if the strings are equal.
    
  • これ拡大する ==。それでも(のみ)同一性テストを実行します。

    $ [ aaaa == aaaa ] && echo yes
    yes
    
    $ [ aaaa == a* ] && echo yes
    $
    

    パスワードに一致するファイル名がある場合、a*引用符のない内容は1つ以上のファイル名に展開されます。具体的には、aaaaという既存のファイルのため、コードはyesとして出力されます。一致するファイルがない場合は、failedglob と nullglob シェルオプションの影響を受けて正確な比較が行われます。

  • =a内のAは、次のもの[[とまったく同じです。

  • ==a 内部の A は、[[バイトごとのマッチングとグローバルマッチングの両方を実行します。

    右側の文字列または変数を==参照すると、バイト比較が実行されます。すべてのバイトが等しい場合、結果は[[「良い」(0)です。

    文字列(またはすべての場合に好ましくは変数)が引用されていない場合は、ファイル名globと同様に一致が行われます。

    $ [[ aaaa == "aaaa" ]] && echo yes
    yes
    
    $ a='aaaa'
    $ [[ aaaa == "$a" ]] && echo yes
    yes
    
    $ a='a*'
    $ [[ aaaa == "$a" ]] && echo yes
    $
    
    $ a='a*'
    $ [[ aaaa == $a ]] && echo yes
    yes
    

興味深いことに、引用されていない内容aaaaも機能します。

$ a='aaaa'
$ [[ aaaa = $a ]] && echo yes
yes

これは、変数内の文字列に拡張可能なグローバル文字、、および拡張*+有効な場合)が含まれていない?ために発生します。しかし、これはしばしば危険な選択です。[|@!

関連情報