Ich möchte ein Shell-Skript schreiben, das prüft, ob eine bestimmte Datei archived_sensor_data.json
vorhanden ist, und sie in diesem Fall löscht. Nach http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html habe ich Folgendes versucht:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Dies löst jedoch einen Fehler aus
[-e: command not found
wenn ich versuche, das resultierende test_controller
Skript mit dem ./test_controller
Befehl auszuführen . Was ist los mit dem Code?
Antworten:
Es fehlt ein erforderlicher Abstand zwischen der Klammer und
-e
:quelle
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. Das Skript scheint jetzt zu funktionieren.if [ -e "$1" ]
(Dateinamen-Eingabeargument).Hier ist eine alternative Methode mit
ls
:Wenn Sie eine Ausgabe ausblenden möchten,
ls
sodass nur Ja oder Nein angezeigt wird, leiten Sie umstdout
undstderr
zu/dev/null
:quelle
ls
erfolgreich, gibt es eine solche Datei, sonst gibt es keine". Wenn diesls
fehlschlägt, bedeutet dies nicht, dass die Datei fehlt. Es könnte ein anderer Fehler sein. Erstellen Sie beispielsweise eine Datei in einem Verzeichnis, das root gehört, und versuchen Sie diesls
unter einem normalen Benutzer. Es wird mit fehlschlagenPermission denied
, was nicht gleichbedeutend ist, dass die Datei nicht existiert.Hintergrund meiner Lösungsempfehlung ist die Geschichte eines Freundes, der bis weit in die zweite Woche seines ersten Jobs einen halben Build-Server sauber gewischt hat. Die grundlegende Aufgabe besteht also darin, herauszufinden, ob eine Datei vorhanden ist, und wenn ja, löschen wir sie. Aber es gibt ein paar tückische Stromschnellen an diesem Fluss:
Alles ist eine Datei.
Skripte haben nur dann echte Leistung, wenn sie allgemeine Aufgaben lösen
Um allgemein zu sein, verwenden wir Variablen
In Skripten wird häufig -f force verwendet, um manuelle Eingriffe zu vermeiden
Und auch Liebe -r rekursiv, um sicherzustellen, dass wir rechtzeitig erstellen, kopieren und zerstören.
Stellen Sie sich das folgende Szenario vor:
Wir haben die Datei, die wir löschen möchten: filesexists.json
Dieser Dateiname wird in einer Variablen gespeichert
Wir haben auch eine Pfadvariable, um die Dinge wirklich flexibel zu machen
Mal sehen, ob
-e
es das tut, was es soll. Existieren die Dateien?Es tut. Magie.
Was würde jedoch passieren, wenn die Dateivariable versehentlich als Nuffin ausgewertet würde?
Was? Es soll mit einem Fehler zurückkehren ... Und dies ist der Anfang der Geschichte, wie dieser gesamte Ordner versehentlich gelöscht wurde
Eine Alternative könnte darin bestehen, speziell zu testen, was wir als "Datei" verstehen.
Die Datei existiert also ...
Dies ist also keine Datei, und vielleicht möchten wir nicht das gesamte Verzeichnis löschen
man test
hat folgendes zu sagen:quelle
Intern muss der Befehl rm ohnehin auf
Dateiexistenz testen. Warum also einen weiteren Test hinzufügen? Einfach ausgeben
und es wird danach weg sein, ob es dort war oder nicht.
Verwenden Sie rm -f, wenn Sie keine Nachrichten zu nicht vorhandenen Dateien wünschen.
Wenn Sie Maßnahmen ergreifen müssen, wenn die Datei NICHT vorhanden ist, müssen Sie dies selbst testen. Aufgrund Ihres Beispielcodes ist dies in diesem Fall nicht der Fall.
quelle
Wenn Sie ein NFS verwenden, ist "Test" eine bessere Lösung, da Sie eine Zeitüberschreitung hinzufügen können, falls Ihr NFS ausfällt:
Ein "[-e my_file]" - Konstrukt friert ein, bis das NFS wieder funktionsfähig ist:
quelle
test
und[
sind auch. Sie können auchtimeout
mit verwenden[
undtest
friert auch ein, wenn NFS hängt.