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 dash
Versionen vor 0.5.9, wie zum Beispiel der Version 0.5.8 sh
auf 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
.