Neben den kosmetischen / Präferenz-Argumenten könnte ein Grund sein, dass es mehr Implementierungen gibt, bei denen [ ! "$a" = "$b" ]in Eckfällen Fehler auftreten als bei [ "$a" != "$b" ].
Beide Fälle sollten sicher sein, wenn Implementierungen dem POSIX-Algorithmus folgen , aber selbst heute (Anfang 2018, wie zum Zeitpunkt des Schreibens) gibt es noch Implementierungen, die fehlschlagen. Zum Beispiel mit a='(' b=')':
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
Mit dashVersionen vor 0.5.9, wie zum Beispiel der Version 0.5.8 shauf Ubuntu 16.04:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(behoben in 0.5.9, siehe https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Diese Implementierungen behandeln [ ! "(" = ")" ]wie [ ! "(" "text" ")" ]das ist [ ! "text" ](Test , ob „text“ ist der Null - String) , während POSIX Mandate es zu sein [ ! "x" = "y" ](Test „x“ und „y“ für die Gleichstellung). Diese Implementierungen schlagen fehl, weil sie in diesem Fall den falschen Test durchführen.
Beachten Sie, dass es noch ein anderes Formular gibt:
! [ "$a" = "$b" ]
Dieser benötigt eine POSIX-Shell (funktioniert nicht mit der alten Bourne-Shell).
Beachten Sie, dass einige Implementierungen ebenfalls Probleme mit [ "$a" = "$b" ](und [ "$a" != "$b" ]) hatten und immer noch mit dem in Solaris 10 integrierten [Betriebssystem /bin/sh(einer Bourne-Shell, in der sich die POSIX-Shell befindet /usr/xpg4/bin/sh) übereinstimmen . Deshalb sehen Sie Dinge wie:
[ "x$a" != "x$b" ]
In Skripten, die versuchen, auf alte Systeme portierbar zu sein.
!(x==y)von diesen unterscheiden zu können(!x)==y.