Oltre agli argomenti cosmetici / di preferenza, una ragione potrebbe essere che ci sono più implementazioni in cui [ ! "$a" = "$b" ]
fallisce in casi angolari che con [ "$a" != "$b" ]
.
Entrambi i casi dovrebbero essere sicuri se le implementazioni seguono l'algoritmo POSIX , ma anche oggi (inizio 2018 al momento della stesura), ci sono ancora implementazioni che falliscono. Ad esempio, con a='(' b=')'
:
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
Con dash
versioni precedenti alla 0.5.9, come la 0.5.8 trovata come sh
su Ubuntu 16.04 per esempio:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(risolto in 0.5.9, consultare https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Queste implementazioni trattano [ ! "(" = ")" ]
come [ ! "(" "text" ")" ]
cioè [ ! "text" ]
(test se "testo" è la stringa nulla) mentre mandati POSIX che sia [ ! "x" = "y" ]
(test "x" e "y" per l'uguaglianza). Tali implementazioni falliscono perché eseguono il test sbagliato in quel caso.
Nota che c'è ancora un altro modulo:
! [ "$a" = "$b" ]
Quello richiede una shell POSIX (non funzionerà con la vecchia shell Bourne).
Notare che anche diverse implementazioni hanno avuto problemi con [ "$a" = "$b" ]
(e [ "$a" != "$b" ]
) e continuano a [
piacersi il built-in di /bin/sh
Solaris 10 (una shell Bourne, la shell POSIX è in /usr/xpg4/bin/sh
). Ecco perché vedi cose come:
[ "x$a" != "x$b" ]
Negli script cercando di essere portabile su vecchi sistemi.
!(x==y)
da(!x)==y
.