J'aimerais écrire un script Shell qui vérifie si un certain fichier, archived_sensor_data.json
, existe et, le cas échéant, le supprime. Après http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html , j'ai essayé les solutions suivantes:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Cependant, cela jette une erreur
[-e: command not found
lorsque j'essaie d'exécuter le script test_controller
résultant à l'aide de la commande ./test_controller
. Quel est le problème avec le code?
Il vous manque un espace entre le crochet et -e
:
#!/bin/bash
if [ -e x.txt ]
then
echo "ok"
else
echo "nok"
fi
Voici une méthode alternative utilisant ls
:
(ls x.txt && echo yes) || echo no
Si vous souhaitez masquer une sortie de ls
pour que vous ne voyiez que oui ou non, redirigez stdout
et stderr
vers /dev/null
:
(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
En interne, la commande rm doit quand même vérifier l'existence du fichier,
alors pourquoi ajouter un autre test? Juste émettre
rm filename
et il sera parti après cela, si c'était là ou pas.
Utilisez rm -f si vous ne voulez pas de messages concernant des fichiers inexistants.
Si vous devez agir 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 cet exemple.
Le fond de ma recommandation de solution est l’histoire d’un ami qui, bien dans la deuxième semaine de son premier emploi, a effacé la moitié d’un serveur de build. La tâche de base consiste donc à déterminer si un fichier existe et, le cas échéant, supprimons-le. Mais il y a quelques rapides dangereux sur cette rivière:
Tout est un fichier.
Les scripts n'ont de 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 toute intervention manuelle
Et aussi love-r récursif pour nous assurer de créer, copier et détruire en temps voulu.
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 aussi 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 avait été évaluée accidentellement à nuffin '
<Host>:~/Documents/thisfolderexists filevariable=""
<Host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Quelle? 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 comprenons être 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 que nous ne voulons pas supprimer tout ce répertoire
man test
dit ce qui suit:
-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)