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 dashversiones anteriores a 0.5.9, como la 0.5.8 encontrada como shen 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/shSolaris 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.