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 dash
versi sebelum 0.5.9, seperti 0.5.8 yang ditemukan sh
di 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/sh
pada 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
.