Bevorzugt

Bevorzugt

Gibt es einen Unterschied in Bash oder eine bevorzugte Verwendung der Negierung einer Anweisung?

if ! [[ -z "${var}" ]]; then
  do_something
fi

Gegen

if [[ ! -z "${var}" ]]; then
  do_something
fi

Antwort1

! [[ expression ]]

Dies ist wahr, wenn der gesamte Test falsch zurückgibt.

[[ ! expression ]]

Dies ist wahr, wenn der einzelne Ausdruck „false“ zurückgibt.


Da der Test ein zusammengesetzter Ausdruck sein kann, kann dies sehr unterschiedlich sein. Zum Beispiel:

$ [[ ! 0 -eq 1 || 1 -eq 1 ]] && echo yes || echo no
yes
$ ! [[ 0 -eq 1 || 1 -eq 1 ]] && echo yes || echo no
no

Persönlich bevorzuge ich die Verwendung der Negation innerhalb der Testkonstruktion, sofern dies möglich ist, aber außerhalb davon ist sie, je nach Absicht, vollkommen in Ordnung.

Antwort2

A ! cmdist eigentlich einRohr, und !negiert den Exit-Code desganzRohr.

Von Man Bash:

Pipelines Eine Pipeline ist eine Folge von einem oder mehreren Befehlen, die durch einen der Steueroperatoren | oder |& getrennt sind. Das Format für eine Pipeline ist:

         [time [-p]] [ ! ] command [ [|||&] command2 ... ]

...
Wenn das reservierte Wort ! einer Pipeline vorangestellt ist, ist der Beendigungsstatus dieser Pipeline die logische Negation des Beendigungsstatus, wie oben beschrieben. Die Shell wartet, bis alle Befehle in der Pipeline beendet sind, bevor sie einen Wert zurückgibt.

In diesem Sinne:

! [[ 2 -eq 2 ]]

Ist die Negation ( !) des Exit-Codes des Ganzen [[(nachdem alles ausgeführt wurde). Dies hat also einen Exit-Code von 0:

!  [[ 2 -eq 2 && 3 -eq 4 ]]

Jedoch

A [[ ! ]]ist einZusammengesetzter Befehl(keine Pipe). Von man bash:

Zusammengesetzte Befehle
...
[[Ausdruck]]
Gibt einen Status von 0 oder 1 zurück, abhängig von der Auswertung des bedingten Ausdrucks.
Ausdrücke bestehen aus den unten unter BEDINGTE AUSDRÜCKE beschriebenen Primärwerten.

Daher hat dies einen Exitcode von 1:

[[ ! 2 -eq 2 && 3 -eq 4 ]]

Denn das ist eigentlich gleichbedeutend mit Folgendem:

[[ ( ! 2 -eq 2 ) && ( 3 -eq 4 ) ]]

Durch die Kurzschlussauswertung &&wird die rechte Seite nie ausgewertet und entspricht tatsächlich diesem viel kürzeren Ausdruck:

[[ ! 2 -eq 2 ]]

Was immer falsch sein wird (1).

Kurz gesagt: Im Inneren [[wirkt das !Teiledes Ausdrucks.

Bevorzugt

Die Verwendung von !inside [[ist viel gebräuchlicher (und auf mehr Shells portierbar (mit [)), kann aber manchmal verwirrend sein, wenn sie nicht explizit durch eine umsichtige Verwendung von gesteuert wird, ()um das Ausmaß der Negation abzugrenzen (was innerhalb [von Konstrukten zu einem Problem werden könnte).

Aber (in Bash, Ksh und Zsh) ist das Ergebnis ! [[ziemlich klar definiert und leichter zu verstehen: Führen Sie das Ganze aus [[und negieren Sie das Ergebnis.

Welche verwendet werden sollte, ist eine Frage der persönlichen Vorliebe (und des Verständnisses).

verwandte Informationen