Ich habe ein if
in meinem Bash-Skript, das überprüfen muss, ob JEDE der 2 Dateien vorhanden ist. Wenn sie nicht vorhanden sind, sollte es eine Echo-Übereinstimmung geben.
Code, den ich habe:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
Aber das scheint aus irgendeinem Grund nicht zu funktionieren.
Ich bin zu 110% sicher, dass diese 2 Dateien nicht existieren. Ich bekomme keine Fehler, es geht einfach nicht in die if
.
Ich bin neu im Bash-Scripting, daher bin ich mir nicht sicher, was falsch sein könnte.
bash
shell-script
Peppercat101
quelle
quelle
[[ ! -f /etc/.../... ]]; echo $?
für jeden.[[ -f xxx ]]
Gibt true zurück, wenn xxx vorhanden ist und eine reguläre Datei (oder ein Symlink zu einer regulären Datei) ist. Es wird false zurückgegeben, wenn es nicht existiert oder wenn es nicht erkennen kann, ob es existiert oder nicht oder ob es existiert, aber keine reguläre Datei (Verzeichnis, Pipe, Gerät, Socket ...) ist oder ob es sich um einen Symlink handelt zu einer Datei, die nicht existiert oder nicht erkennen kann, ob sie existiert oder nicht oder keine reguläre Datei ist ...[[ -e $file ]] || [[ -L $file ]]
ist näher an einem Test für die Existenz.ls -d -- "$file" > /dev/null 2>&1
ist noch näher. Und in der Regel führt diese Art von Test zu Rennbedingungen. Vielleicht gibt es einen anderen Weg.Antworten:
Wenn Sie entweder wollen
OR
, dann wollen Sie nichtAND
.match
wenn beide nicht vorhanden sind.Aber du hast gesagt:
Ihre Aussage widerspricht sich also. Mindestens eine dieser Dateien muss vorhanden sein, wenn Sie diesen Code ausführen.
Wenn Sie sehen möchten, wie Ihre
if
Anweisung bewertet wird, führen Sie sie mit aus-x
.Dann sehen Sie die Ausführung.
quelle
Sollte das nicht so sein? A ist eine Datei oder B ist eine Datei, dann blabla.
quelle
Dies kann auch für das funktionieren, was Sie versuchen zu tun. Einzelne Klammern werden heutzutage bei Bash nicht mehr häufig verwendet, dies ist jedoch immer noch eine Option. Die Verwendung von '-o' ist effektiv eine "ODER" -Operation und "!" negiert die Bedingung.
quelle
[
inbash
. Abgesehen davon sehe ich nicht, wie dies die Frage beantwortet.[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
es sollte sein. Die Aufgabe war: Wenn sie (beide) nicht existieren, sollte es so seinecho match
.Ihr Code erfüllt Ihre Anforderungen: Er wird gedruckt,
match
sofern keine der beiden Dateien gefunden werden kann.Daher wird der Grund
match
nicht an anderer Stelle gedruckt. Sie sollten bestätigen, dass der Codeblock erreicht ist. Dies können Sie tun, indem Sie ihn mit einigen Debug-Meldungen umgeben. Zum Beispiel so:Normalerweise bevorzuge ich das Debuggen von Nachrichten an stderr , um zu vermeiden, dass der Datenfluss zu stdout unterbrochen wird. Ich habe dies hier jedoch vermieden, weil Sie sagten, Sie seien Anfänger. Hier ist ein Beispiel, das zeigt, wie Sie in stdout schreiben können :
quelle