Selain argumen kosmetik / preferensi, satu alasan bisa jadi bahwa ada lebih banyak implementasi di mana [ ! "$a" = "$b" ]gagal dalam kasus sudut daripada dengan [ "$a" != "$b" ].
Kedua kasus harus aman jika implementasi mengikuti algoritma POSIX , tetapi bahkan hari ini (awal 2018 saat penulisan), masih ada implementasi yang gagal. Misalnya, dengan a='(' b=')':
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
Dengan dashversi sebelum 0.5.9, seperti 0.5.8 yang ditemukan shdi Ubuntu 16.04 misalnya:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(diperbaiki dalam 0,5.9, lihat https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Implementasi tersebut diperlakukan [ ! "(" = ")" ]seperti [ ! "(" "text" ")" ]itu [ ! "text" ](uji apakah "teks" adalah string nol) sementara POSIX mengamanatkannya [ ! "x" = "y" ](uji "x" dan "y" untuk kesetaraan). Implementasi tersebut gagal karena mereka melakukan tes yang salah dalam kasus itu.
Perhatikan bahwa masih ada formulir lain:
! [ "$a" = "$b" ]
Yang itu membutuhkan shell POSIX (tidak akan bekerja dengan shell Bourne yang lama).
Perhatikan bahwa beberapa implementasi memiliki masalah dengan [ "$a" = "$b" ](dan [ "$a" != "$b" ]) juga dan masih seperti [builtin /bin/shpada Solaris 10 (shell Bourne, shell POSIX berada di /usr/xpg4/bin/sh). Itu sebabnya Anda melihat hal-hal seperti:
[ "x$a" != "x$b" ]
Dalam skrip mencoba menjadi portabel untuk sistem lama.
!(x==y)dari(!x)==y.