外観/設定引数のほかに、理由の1つ[ ! "$a" = "$b" ]は、の場合よりもコーナーケースで失敗する実装が多いことです[ "$a" != "$b" ]。
実装がPOSIXアルゴリズムに準拠していれば、どちらのケースも安全であるはずですが、今日(執筆時点で2018年初頭)でも、失敗する実装が残っています。たとえば、とa='(' b=')':
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
dash発見0.5.8のようなより前のバージョン0.5.9に、sh例えばUbuntuの16.04で:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(0.5.9で修正済み、https: //www.mail-archive.com/dash@vger.kernel.org/msg00911.htmlを参照)
これらの実装は[ ! "(" = ")" ]そのまま (「テキスト」がヌル文字列かどうかをテストします)POSIXがそれを要求します(「x」と「y」が等しいかどうかをテストします)。それらの実装は、その場合に間違ったテストを実行するため失敗します。[ ! "(" "text" ")" ][ ! "text" ][ ! "x" = "y" ]
さらに別のフォームがあることに注意してください。
! [ "$a" = "$b" ]
そのためにはPOSIXシェルが必要です(古いBourneシェルでは機能しません)。
いくつかの実装では[ "$a" = "$b" ](および[ "$a" != "$b" ])にも問題が[あり/bin/sh、Solaris 10の組み込み(Bourneシェル、POSIXシェルは/usr/xpg4/bin/sh)のようになっていることに注意してください。そのため、次のようなものが表示されます。
[ "x$a" != "x$b" ]
古いシステムに移植しようとするスクリプト内。
!(x==y)からに(!x)==y。