外観/設定引数のほかに、理由の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
。