Lo sfondo della mia raccomandazione di soluzione è la storia di un amico che, nella seconda settimana del suo primo lavoro, ha cancellato mezzo server di build. Quindi l'attività di base è capire se esiste un file e, in tal caso, eliminiamolo. Ma ci sono alcune rapide insidiose su questo fiume:
Tutto è un file.
Gli script hanno un vero potere solo se risolvono compiti generali
Per essere generali, usiamo le variabili
Usiamo spesso -f force negli script per evitare l'intervento manuale
E anche l'amore -r ricorsivo per essere sicuri di creare, copiare e distruggere in modo tempestivo.
Considera il seguente scenario:
Abbiamo il file che vogliamo eliminare: filesexists.json
Questo nome file è memorizzato in una variabile
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
Abbiamo anche una variabile path per rendere le cose davvero flessibili
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Quindi vediamo se -efa quello che dovrebbe. I file esistono?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Lo fa. Magia.
Tuttavia, cosa accadrebbe se la variabile del file venisse accidentalmente valutata come nuffin '
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Che cosa? Dovrebbe tornare con un errore ... E questo è l'inizio della storia di come l'intera cartella è stata cancellata per caso
Un'alternativa potrebbe essere quella di testare in modo specifico ciò che riteniamo essere un "file"
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Quindi il file esiste ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Quindi questo non è un file e forse non vogliamo cancellare l'intera directory
man test ha il seguente da dire:
-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)