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
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
Wir haben auch eine Pfadvariable, um die Dinge wirklich flexibel zu machen
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Mal sehen, ob -e
es das tut, was es soll. Existieren die Dateien?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Es tut. Magie.
Was würde jedoch passieren, wenn die Dateivariable versehentlich als Nuffin ausgewertet würde?
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
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.
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Die Datei existiert also ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Dies ist also keine Datei, und vielleicht möchten wir nicht das gesamte Verzeichnis löschen
man test
hat folgendes zu sagen:
-b FILE
FILE exists and is block special
-c FILE
FILE exists and is character special
-d FILE
FILE exists and is a directory
-e FILE
FILE exists
-f FILE
FILE exists and is a regular file
...
-h FILE
FILE exists and is a symbolic link (same as -L)