Además de los argumentos cosméticos / de preferencia, una razón podría ser que hay más implementaciones donde [ ! "$a" = "$b" ]
falla en casos de esquina que con [ "$a" != "$b" ]
.
Ambos casos deberían ser seguros si las implementaciones siguen el algoritmo POSIX , pero incluso hoy (a principios de 2018 a partir de la escritura), todavía hay implementaciones que fallan. Por ejemplo, con a='(' b=')'
:
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
Con dash
versiones anteriores a 0.5.9, como la 0.5.8 encontrada como sh
en Ubuntu 16.04 por ejemplo:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(corregido en 0.5.9, consulte https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Esas implementaciones se tratan [ ! "(" = ")" ]
como [ ! "(" "text" ")" ]
es [ ! "text" ]
(prueba si "texto" es la cadena nula) mientras POSIX lo obliga a ser [ ! "x" = "y" ]
(prueba "x" e "y" para la igualdad). Esas implementaciones fallan porque realizan la prueba incorrecta en ese caso.
Tenga en cuenta que todavía hay otra forma:
! [ "$a" = "$b" ]
Ese requiere un shell POSIX (no funcionará con el antiguo shell Bourne).
Tenga en cuenta que varias implementaciones también han tenido problemas con [ "$a" = "$b" ]
(y [ "$a" != "$b" ]
) y todavía les gusta la [
creación de /bin/sh
Solaris 10 (un shell Bourne, estando el shell POSIX /usr/xpg4/bin/sh
). Por eso ves cosas como:
[ "x$a" != "x$b" ]
En scripts que intentan ser portables a sistemas antiguos.
!(x==y)
entre(!x)==y
.