Outre les arguments cosmétiques / préférence, une des raisons pourrait être qu'il y a plus d'implémentations où [ ! "$a" = "$b" ]
échoue dans les cas d'angle qu'avec [ "$a" != "$b" ]
.
Les deux cas devraient être sûrs si les implémentations suivent l'algorithme POSIX , mais même aujourd'hui (début 2018 au moment de l'écriture), il y a toujours des implémentations qui échouent. Par exemple, avec a='(' b=')'
:
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
Avec les dash
versions antérieures à 0.5.9, comme la 0.5.8 trouvée sh
sur Ubuntu 16.04 par exemple:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(corrigé dans 0.5.9, voir https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Ces implémentations traitent [ ! "(" = ")" ]
comme [ ! "(" "text" ")" ]
c'est [ ! "text" ]
(test si « texte » est la chaîne null) alors que les mandats POSIX à être [ ! "x" = "y" ]
(test « x » et « y » pour l' égalité). Ces implémentations échouent car elles effectuent le mauvais test dans ce cas.
Notez qu'il existe encore un autre formulaire:
! [ "$a" = "$b" ]
Celui-ci nécessite un shell POSIX (ne fonctionnera pas avec l'ancien shell Bourne).
Notez que plusieurs implémentations ont également eu des problèmes avec [ "$a" = "$b" ]
(et [ "$a" != "$b" ]
) et font toujours comme le [
buildin de /bin/sh
Solaris 10 (un shell Bourne, le shell POSIX étant dedans /usr/xpg4/bin/sh
). Voilà pourquoi vous voyez des choses comme:
[ "x$a" != "x$b" ]
Dans des scripts essayant d'être portables sur d'anciens systèmes.
!(x==y)
de(!x)==y
.