Gibt es einen Grund, "[ ! -f Datei ] || Befehl" statt "[ -f Datei ] && Befehl" zu verwenden?

Gibt es einen Grund, "[ ! -f Datei ] || Befehl" statt "[ -f Datei ] && Befehl" zu verwenden?

ich fand

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

in /etc/default/lxcUbuntu 16.04, das (meinen eigenen Code oder den des Paketbetreuers) zu ersetzen scheint

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

Da der Test kontraintuitiv ist (führen Sie den Befehl aus, wenn der Test wegen Nichtvorhandenseins der Datei fehlschlägt), habe ich mich gefragt, ob er gegenüber der &&-Version irgendwelche Vorteile hat.

Antwort1

Ja, wenn Sie sich für dieExit-Code der zusammengesetzten Anweisung. Versuche Folgendes:

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

Führen Sie es dann mit trueund falseals Argumente aus.

./script true
0
0

./script false
0
1

Das ist weilKurzschlussauswertungvon Booleschen Ausdrücken.

Nehmen wir im Beispiel des OP anDie Datei existiert nicht:

  • Im ersten Fall gibt die erste Bedingung TRUE zurück, die zweite Operation ( TRUE OR x = TRUE) muss nicht ausgewertet werden. Sie erhalten TRUE für die zusammengesetzte Anweisung.
  • Im zweiten Fall gibt die erste Bedingung FALSE zurück, die zweite Operation ( FALSE AND x = FALSE) muss nicht ausgewertet werden. Sie erhalten ein FALSE für die zusammengesetzte Anweisung.

Exit-Codes sind sehr wichtig. Überprüfen SieWas bedeutet „set -e“ in einem Bash-Skript?um mögliche Auswirkungen von set -e, trapund zu sehen set -o pipefail.

Antwort2

[ -f file ]ist wahr, wenn fileexistiertUndist ein plain file.

[ ! -f file ]ist wahr, wenn filenicht existiertoderist ein anderer Dateityp.

Es gibt also keinen wirklichen Unterschied – außer der Lesbarkeit.

verwandte Informationen