La toile de fond de ma recommandation de solution est l'histoire d'un ami qui, bien dans la deuxième semaine de son premier travail, a nettoyé la moitié d'un serveur de construction. Donc, la tâche de base est de déterminer si un fichier existe, et si c'est le cas, supprimons-le. Mais il y a quelques rapides perfides sur cette rivière:
Tout est un fichier.
Les scripts n'ont un réel pouvoir que s'ils résolvent des tâches générales
Pour être général, nous utilisons des variables
Nous utilisons souvent -f force dans les scripts pour éviter une intervention manuelle
Et aussi aimer -r récursif pour nous assurer que nous créons, copions et détruisons en temps opportun.
Considérez le scénario suivant:
Nous avons le fichier que nous voulons supprimer: filesexists.json
Ce nom de fichier est stocké dans une variable
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
Nous avons également une variable de chemin pour rendre les choses vraiment flexibles
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Voyons donc si -e
fait ce qu'il est censé faire. Les fichiers existent-ils?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Cela fait. La magie.
Cependant, que se passerait-il si la variable de fichier était accidentellement évaluée à nuffin '
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Quoi? Il est censé revenir avec une erreur ... Et c'est le début de l'histoire comment tout ce dossier a été supprimé par accident
Une alternative pourrait être de tester spécifiquement ce que nous considérons comme un `` fichier ''
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Donc le fichier existe ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Donc, ce n'est pas un fichier et peut-être, nous ne voulons pas supprimer tout ce répertoire
man test
a ce qui suit à 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)