Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

pingouinux #2 a écrit :

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 smile
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 smile

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.... tongue

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. smile

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 smile

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 smile
PS : j'ai reposté autre chose (problème avec script de sauvegarde) si tu pourrai y jeter un œil stp.
Merci

Hors ligne