Comment tester si un dossier existe ? - Shell/Batch - Programmation
Marsh Posté le 12-03-2006 à 20:59:22
Il faut faire :
if [ -d "/home" ]; then
echo "/home existe bien"
else
echo "existe pas"
fi
Marsh Posté le 13-03-2006 à 10:16:43
Willits a écrit : Donc, j'ai lus qu'il existait la commande test, mais je ne sais pas comment récupérer son résultat. |
La commande "test" (qu'on peut aussi écrire "[ ... ]" sert à tester toute sorte d'égalité, inégalités, caractéristiques diverses sur les fichiers dans Unix (et systèmes apparentés)
Son principe est de ne rien afficher (sauf s'il y a une erreur de syntaxe) mais de stocker le résultat du test dans la variable "$?" (qui sert à indiquer l'état final d'une commande => 0 = OK, , not(0) = pas ok).
Donc le premier moyen de se récupérer le résultat de la commande "test" est de le faire de cette manière:
test <quelque chose> |
Si on a "0", c'est que le test a réussi. Si on n'a pas 0, c'est que le test a échoué.
Ensuite, comme l'a dit sod4, on peut inclure le test dans une alternative "if" qui permet, en fonction du résultat du test, de se brancher sur un bloc "then" ou un bloc "else". Mais bien que dans 98% des cas on trouve des "if test" ou "if [ ... ]", rien n'oblige d'utiliser "test" dans un "if" (on peut très bien utiliser une autre commande que "test" après un "if" ) ou d'utiliser un "if" pour faire un "test" (on peut très bien faire un simple "test" et récupérer "$?" pour s'en servir ailleurs...)
Willits a écrit : Car quand je lance "test -d /home" dans un terminal, rien n'est renvoyé, et pareil si le dossier n'existe pas. |
Ne pas confondre "rien n'est renvoyé" et "rien ne s'affiche"...
Willits a écrit : j'ai besoin de savoir si un fichier ou un dossier existe. |
test -d => teste l'existence d'un dossier (un fichier de type "d" )
test -f => teste l'existence d'un fichier (fichier de type "-" )
test -L => teste l'existence d'un lien symbolique (fichier de type "l" )
test -s => teste l'existence d'un socket (fichier de type "s" )
test -b => teste l'existence d'un fichier I/O en mode bloc (fichier de type "b" )
test -c => teste l'existence d'un fichier I/O en mode caractère (fichier de type "c" )
test -e => teste l'existence d'un fichier quel que soit son
type mais ne fonctionne qu'en bash. Pour faire pareil en "sh" (vieux Unix), il faut faire
"ls -d <fichier> 1>/dev/null 2>&1"
Petit danger => "test -d" sur un lien symbolique vers un dossier renvoie "vrai" (le test s'applique sur la cible du lien et non sur le lien lui-même). Si on veut tester que le fichier est un vrai répertoire, il faut faire un test de ce type
test -d dossier -a ! -L dossier |
Cours complet et en français de shell ici: http://fr.lang.free.fr/cours/Shell_v1.4.pdf
Marsh Posté le 12-03-2006 à 20:51:36
Bonsoir à tous,
je crée un petit script bash, et j'ai besoin de savoir si un fichier ou un dossier existe.
Donc, j'ai lus qu'il existait la commande test, mais je ne sais pas comment récupérer son résultat.
Car quand je lance "test -d /home" dans un terminal, rien n'est renvoyé, et pareil si le dossier n'existe pas.
Je vous remercie.
Willits