#1 Le 16/10/2013, à 20:33
- Dany007
Résolu - Problème avec structure de contrôle IF
Bonjour
Je rencontre un problème avec l'utilisation de la structure IF.
Voici l'énoncé de mon exercice:
Créer un script avec un nom de répertoire et un nom de fichier en paramètres. Afficher un message d’erreur si :
• Le nombre de paramètres n’est pas deux
• Le répertoire n’existe pas
• Le fichier n’existe pas dans le répertoire
Exécuter le script s’il n’y a aucune erreur
Voici mon script:
#!/bin/bash
if [ $# -ne 2 ] ; then
if [ -d $1 ] ; then
cd $1
if [ -e $2 ] ; then
echo " Il y à bien un fichier "
else
echo " File $2 n'existe pas "
fi
else
echo " Il n'y à pas de répertoire $1 "
fi
else
echo " Il faut deux paramètres "
fi
Le résultat que j'obtiens n'est pas ce que j'attendais car même en ayant créer manuellement deux répertoires (un avec un fichier à l'intérieur que j'ai appelé '$1' et un autre sans fichier à l'intérieur que j'ai appelé 'dada'), voici ce que j'obtiens:
~./exo3 $1
Il y à bien un fichier
~./exo3 dada
Il y à bien un fichier
C'est-à-dire que le programme considère qu'il y à un fichier dans le répertoire 'dada' alors que celui-ci est vide.
D'avance, merci de votre aide.
Dany
Dernière modification par Dany007 (Le 18/10/2013, à 21:18)
Hors ligne
#2 Le 16/10/2013, à 21:05
- pingouinux
Re : Résolu - Problème avec structure de contrôle IF
Hello,
Prends l'habitude de placer les arguments entre " " (exemple if [ -d "$1" ]). C'est indispensable si les paramètres contiennent des espaces.
Tu as inversé le test sur le nombre de paramètres, ce qui fait que tu passes dans le test
if [ -e $2 ]
alors que $2 est vide. Je suppose que le test retourne vrai parce qu'il considère -e comme une chaîne non nulle.
Ajouté :
Si tu avais écrit
if [ -e "$2" ]
le test n'aurait pas été vérifié.
Dernière modification par pingouinux (Le 16/10/2013, à 21:08)
Hors ligne
#3 Le 16/10/2013, à 21:52
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Merci pour ces explications.
Du coup, j'ai mis des guillemets partout car il y à des espaces partout et voici ce que cela donne:
#!/bin/bash
if [ "$#" -ne 2 ] ; then
if [ -d "$1" ] ; then
cd "$1"
if [ -e "$2" ] ; then
echo " Il y à bien un fichier "
else
echo " Il n'y à pas de fichier "
fi
else
echo " Il n'y à pas de répertoire "
fi
else
echo " Il faut deux paramètres "
fi
Maintenant, je rencontre un autre problème.
Lorsque je lance la commande suivante:
~./exo3 dada
Il n'y à pas de fichier
==> Ce qui est juste.
Mais lorsque je lance cette commande:
~./exo3 $1
Il n'y à pas de fichier
==> Il ne reconnait plus le fichier à l'intérieur et l'erreur s'est inversée.
Hors ligne
#4 Le 16/10/2013, à 22:06
- pingouinux
Re : Résolu - Problème avec structure de contrôle IF
Tu as inversé le test sur le nombre de paramètres
Tu appelles exo3 avec un seul paramètre, il devrait sortir immédiatement en erreur.
Avoir un répertoire dont le nom commence par $, c'est chercher les ennuis. Es-tu sûr qu'il existe bien ?
De plus, il faut dans ce cas appeler le script ainsi :
./exo3 \$1
ou
./exo3 '$1' # Ce sont bien des simples quotes, pour éviter l'expansion du paramètre
Hors ligne
#5 Le 16/10/2013, à 22:07
- Watael
Re : Résolu - Problème avec structure de contrôle IF
salut,
$# est toujours un nombre, les guillemets ne sont pas utiles.
Tu as appelé un répertoire '$1' ? Le shell va développer '$1' en son premier argument, mais il est rarement renseigné : il faut protéger le signe dollar pour que le développement n'opère pas.
./script "\$1"
Utilises les balises code, stp.
Dernière modification par Watael (Le 16/10/2013, à 22:07)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 16/10/2013, à 22:40
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Bon, je vais faire un récapitulatif entier.
==> J'ai changé le nom du répertoire '$1' en l'intitulant "rep1"
==> J'ai changé le nom du répertoire 'dada' en l'intitulant "rep2"
==> Le "rep1" contient un fichier TXT.
==> Le "rep2" ne contient rien du tout
==> "rep1" et "rep2" sont placé dans home\dany\SCRIPTDEVELOPCOM\
==> le script "exo3" est placé dans home\dany\SCRIPTDEVELOPCOM\
Mon script est le suivant:
#!/bin/bash
if [ $# -ne 2 ] ; then
if [ -d "$1" ] ; then
cd $1
if [ -e "$2" ] ; then
echo "Il à un fichier dans ce répertoire"
else
echo "Il y à pas de fichier dans ce répertoire"
fi
else
echo "Il n'y à pas de répertoire"
fi
else
echo "Il faut deux paramètres"
fi
===================
Lorsque j'exécute le script, j'obtiens ceci:
~ ./exo3 rep1
Il n'y à pas de fichier dans ce répertoire
~ ./exo3 rep2
Il n'y à pas de fichier dans ce répertoire
==================
Je craque...
Hors ligne
#7 Le 16/10/2013, à 22:42
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
~ ./exo3 \rep1
Il n'y à pas de fichier dans ce répertoire
~ ./exo3 \rep2
Il n'y à pas de fichier dans ce répertoire
et
~ ./exo3 "\rep1"
Il n'y à pas de répertoire
~ ./exo3 "\rep2"
Il n'y à pas de répertoire
Hors ligne
#8 Le 17/10/2013, à 00:08
- Watael
Re : Résolu - Problème avec structure de contrôle IF
#!/bin/bash
if test $# -ne 2
then
echo "2 args needed"
exit 1
elif test -d "$1"
then
echo "$1 est un répertoire"
if test -f "$1/$2"
then
echo "$2 est un fichier dans $1"
else
echo "$2 n'existe pas dans $1"
exit 2
fi
else
echo "$1 n'existe pas ou n'est pas un répertoire"
exit 4
fi
$ ./monScript "un argument"
2 args needed
$ echo $?
1
$ ./monScript rep2 TXT
rep2 est un répertoire
TXT n'existe pas dans rep2
$ echo $?
2
$ ./monScript rep1 TXT
rep1 est un répertoire
TXT est un fichier dans rep1
$ ./monScript non-exist fichierBidon
non-exist n'existe pas ou n'est pas un répertoire
$ echo $?
4
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 17/10/2013, à 08:17
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Hello
Merci beaucoup pour le message.
Si tu me le permets, je réaliserai cette opération ne fin de journée et clôturerais également le dossier.
A plus tard et bonne journée
Dany
Hors ligne
#10 Le 18/10/2013, à 21:16
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Bonsoir Pingouinux et Watael
Je suis désolé pour ce retard mais j'ai trouvé la solution
C'est-à-dire que mon Prof m'a expliqué que:
1. Il ne faut pas mettre de guillemets entre les arguments : donc $1 et pas "$1"
2. Ma ligne de commande était fausse car je tapai "./exo3 rep1" alors que je devai taper "./exo3 rep1 $2"
=> Le message "Il n'y à pas de fichier dans ce répertoire" était en rapport avec 'rep1' et non '$2' (en clair, la commande allé jusqu'à rep1 et pas plus loin).
Voici donc le script et la commande :
#!/bin/bash
if [ $# -ne 2 ] ; then
if [ -d $1 ] ; then
cd $1
if [ -e $2 ] ; then
echo "Il à un fichier dans ce répertoire"
else
echo "Il y à pas de fichier dans ce répertoire"
fi
else
echo "Il n'y à pas de répertoire"
fi
else
echo "Il faut deux paramètres"
fi
=====================
./exo3 rep1 $2
Il y à un fichier dans ce répertoire
Ouf....
Je tenais à vous dire un grand merci pour votre aide.
Bon week-end.
Dany
Hors ligne
#11 Le 18/10/2013, à 21:36
- Watael
Re : Résolu - Problème avec structure de contrôle IF
Il ne faut pas mettre de guillemets entre les arguments : donc $1 et pas "$1"
au contraire !
Si un paramètre contient un caractère qui figure dans l'IFS (espace, tabulation et alinea, par défaut), alors le test échouera en clamant qu'il y a trop de paramètres.
Et si la variable est vide; alors le test échouera aussi, clamant, cette fois qu'il n'y a pas assez de paramètres.
Les variables doivent toujours être mises entre guillemets (sauf exceptions, mais ce n'en est pas une ici).
Et, pense à utiliser la balise code !
Dernière modification par Watael (Le 18/10/2013, à 21:38)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 18/10/2013, à 21:38
- pingouinux
Re : Résolu - Problème avec structure de contrôle IF
Bonsoir,
Désolé, mais ton script en #10 n'est pas correct. Il est d'ailleurs identique (à part les echo) à celui que tu donnes en #1.
Les réponses de Watael et les miennes sont toujours valables.
Dernière modification par pingouinux (Le 18/10/2013, à 21:39)
Hors ligne
#13 Le 18/10/2013, à 21:56
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Re-bonsoir,
Pinguoinux, j'ai donc refais un test de mon côté:
Rappel: mon dossier contient un répertoire intitulé 'rep1' contenant un fichier '$2' et un répertoire intitulé 'rep2' ne contenant aucun fichier.
Voici donc le script (similaire à celui en #1)
if [ $# -ne 2 ] ; then
if [ -d $1 ] ; then
cd $1
if [ -e $2 ] ; then
echo " Il y à bien un fichier "
else
echo " File $2 n'existe pas "
fi
else
echo " Il n'y à pas de répertoire $1 "
fi
else
echo " Il faut deux paramètres "
fi
Quand je tape : ./exo3test rep1 $2
J'obtiens: Il y à bien un fichier
Watael, merci pour cette précision, je garde cette précision pour le futur.
Hors ligne
#14 Le 18/10/2013, à 21:57
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Oui, je ne remets pas en cause vos réponses, juste qu'à mon niveau, je n'utilisai pas encore toutes vos commandes et préfère resté 'collé' à ce que me dit ma prof car c'est elle qui va corriger
Hors ligne
#15 Le 18/10/2013, à 22:07
- pingouinux
Re : Résolu - Problème avec structure de contrôle IF
Comme je te l'ai dit en #2 et en #4, le test ne doit pas être
if [ $# -ne 2 ] ; then
mais
if [ $# -eq 2 ] ; then
L'appel du script, si ton fichier s'appelle réellement $2, ce qui est une source d'ennuis, doit être :
./exo3test rep1 '$2'
ou
./exo3test rep1 \$2
$2 est sans doute une chaîne vide (voir mon explication en #2)
PS : Je serais curieux de voir le corrigé de ta prof
Hors ligne
#16 Le 18/10/2013, à 22:12
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Oui, effectivement "if [ $# -eq 2 ] ; then" mais parait plus juste que "if [ $# -ne 2 ] ; then"
C'est moi qui me suis trompé : merci pour cette précision!
Je prends note de ne pas appeler mon fichier du même nom que mes variables.
Désolé, je suis juste débutant alors, je dois encore re-doubler d'attention.
Hors ligne
#17 Le 19/10/2013, à 07:25
- pingouinux
Re : Résolu - Problème avec structure de contrôle IF
Précision :
if [ -e $2 ]
sera vrai si $2 est un fichier ou un répertoire. Il vaut mieux le remplacer par
if [ -f "$2" ]
Pendant que tu y es, tu peux aussi remplacer "il y à" par "il y a" dans les commentaires.
Bonne journée
Hors ligne
#18 Le 19/10/2013, à 12:05
- Dany007
Re : Résolu - Problème avec structure de contrôle IF
Ok, merci
PS : j'ai reposté autre chose (problème avec script de sauvegarde) si tu pourrai y jeter un œil stp.
Merci
Hors ligne