![Gibt es einen Grund, "[ ! -f Datei ] || Befehl" statt "[ -f Datei ] && Befehl" zu verwenden?](https://rvso.com/image/88490/Gibt%20es%20einen%20Grund%2C%20%22%5B%20!%20-f%20Datei%20%5D%20%7C%7C%20Befehl%22%20statt%20%22%5B%20-f%20Datei%20%5D%20%26%26%20Befehl%22%20zu%20verwenden%3F.png)
ich fand
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
in /etc/default/lxc
Ubuntu 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 true
und false
als 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
, trap
und zu sehen set -o pipefail
.
Antwort2
[ -f file ]
ist wahr, wenn file
existiertUndist ein plain file
.
[ ! -f file ]
ist wahr, wenn file
nicht existiertoderist ein anderer Dateityp.
Es gibt also keinen wirklichen Unterschied – außer der Lesbarkeit.