J'aimerais écrire un script shell qui vérifie si un certain fichier archived_sensor_data.json
existe et, si oui, le supprime. Après http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html , j'ai essayé ce qui suit:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Cependant, cela génère une erreur
[-e: command not found
lorsque j'essaye d'exécuter le test_controller
script résultant en utilisant la ./test_controller
commande. Quel est le problème avec le code?
Réponses:
Il vous manque un espace requis entre le crochet et
-e
:la source
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. Le script semble fonctionner maintenant.if [ -e "$1" ]
(argument d'entrée de nom de fichier).Voici une méthode alternative utilisant
ls
:Si vous souhaitez masquer une sortie de
ls
pour ne voir que oui ou non, redirigezstdout
etstderr
vers/dev/null
:la source
ls
réussit, il existe un tel fichier, sinon il n'y en a pas". En cas d'ls
échec, cela ne signifie pas que le fichier est manquant. Cela pourrait être une autre erreur. Par exemple, créez un fichier dans le répertoire appartenant à root et essayez de le fairels
sous un utilisateur normal. Il échouera avecPermission denied
, ce qui n'est pas équivalent à ce que le fichier n'existe pas.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
Nous avons également une variable de chemin pour rendre les choses vraiment flexibles
Voyons donc si
-e
fait ce qu'il est censé faire. Les fichiers existent-ils?Cela fait. La magie.
Cependant, que se passerait-il si la variable de fichier était accidentellement évaluée à nuffin '
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 ''
Donc le fichier existe ...
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:la source
En interne, la commande rm doit de toute façon tester l'existence du fichier,
alors pourquoi ajouter un autre test? Juste question
et il disparaîtra après cela, que ce soit là ou non.
Utilisez rm -f si vous ne voulez pas de messages sur des fichiers inexistants.
Si vous devez prendre des mesures si le fichier n'existe PAS, vous devez le tester vous-même. D'après votre exemple de code, ce n'est pas le cas dans cette instance.
la source
Si vous utilisez un NFS, "test" est une meilleure solution, car vous pouvez lui ajouter un délai d'attente, au cas où votre NFS serait en panne:
Une construction "[-e mon_fichier]" se fige jusqu'à ce que le NFS soit à nouveau fonctionnel:
la source
test
et[
sont synonymes. Vous pouvez également utilisertimeout
avec[
, ettest
se fige également si NFS se bloque.