IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Pourquoi ne comptabilise-t-il rien ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut Pourquoi ne comptabilise-t-il rien ?
    Bonjour à toutes et à tous j'ai un petit problème dans ce programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #!/bin/bash
     
     
    #Déclaration des variables
    chemin=$HOME/menu
    j=0
    i=0
     
    #Verrification si on passe bien un parametre
    if [ "$#" -eq 1 ]
        then
        #Verrification que $1 est bien un repetoire
    	if [ -d "$chemin/$1" ]
    	    then
                # Si il l'est on regarde de quel type sont les fichier du repertoire
    	      for fichier in "$chemin/$1/*.*"
    		do
    		   if [ -d "$chemin/$1/$fichier"]
    		     then
    			i=`expr $i + 1`
    		   fi
    		   if [ -f "$chemin/$1/$fichier"]
    		     then
    		       j=`expr $j + 1`
    		   fi
    		 done
    		 echo "nombre de repetoire $i"
    		 echo "nombre de fichier $j"
    	else
    		echo "$1 n'est  pas un repertoire"
    	fi
    else
        echo "nombre de parametre incorrecte"
    fi
    C'est lorsque je lui passe le repertoire livre qui contient deux fichiers et qui se trouve dans menu il m'indique qu'il y a 0 fichiers et 0 repertoire ? !

    J'ai pu remarqué en faisant un test qu'il ne parcourt qu'une fois la boucle for alors qu'il devrait le faire 2 fois vu qu'il y a deux fichiers.

    Mais je ne vois pas où est l'erreur dans l'écriture de la boucle ? !

    Amicalement crodilus

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Par défaut
    ligne 19 il y a une apostrophe de trop ... et ce test est sensé faire quoi donc ?

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par mvvvv Voir le message
    ligne 19 il y a une apostrophe de trop ... et ce test est sensé faire quoi donc ?
    Sans compter que if [ "$chemin/$1/$chemin'"] si on ne met pas la bonne variable ($fichier et non deux fois $chemin) ça ne va pas le faire non plus

    Et quand bien même tu aurais mis la bonne, peux-tu nous dire ce que sont censées faire ces deux tests ??? Tes tests ne testent rien, si ce n'est qu'ils renvoient vrai systématiquement, que ce soit un fichier ou un répertoire

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut
    Citation Envoyé par mvvvv Voir le message
    ligne 19 il y a une apostrophe de trop ... et ce test est sensé faire quoi donc ?
    Désolé ce sont des fautes de retranscription car dans le script initiale elle n'y est pas

    Je viens de corriger le script dans le premier message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for fichier in "/$chemin/$1/*.*"
    Pourtant cette écriture veut bien dire pour tout les fichiers du repertoire $1 ?

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 639
    Par défaut
    Bonjour,

    les astérisques ne sont pas développés entre guillemets, donc, à moins d'avoir un fichiers nommé littéralement *.*, le compte de fichier ne décollera pas

    expr n'est pas une commande bash.
    Même un shell strictement POSIX sait faire des évaluations arithmétiques par lui-même :en bash :
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Par défaut
    ce sont les quotes dans ton for le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/bin/bash
     
    #au cas ou il n'y a pas de fichier (bash only)
    shopt -s nullglob
     
    #Déclaration des variables
    chemin=$HOME/menu
    j=0
    i=0
     
    #Verrification si on passe bien un parametre
    if [ "$#" -eq 1 ]
        then
        #Verrification que $1 est bien un repetoire
            if [ -d "$chemin/$1" ]
                then
                  # Si il l'est on regarde de quel type sont les fichier du repertoire
                  for fichier in $chemin/$1/*
                  do
                    # pour tester c'est utile echo $fichier
                       if [ -d "$fichier" ]
                         then
                            i=`expr $i + 1`
                       elif [ -f "$fichier" ]
                       then
                           j=`expr $j + 1`
                       fi
                  done
                     echo "nombre de repetoire $i"
                     echo "nombre de fichier $j"
            else
                    echo "$1 n'est  pas un repertoire"
            fi
    else
        echo "nombre de parametre incorrecte"
    fi

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut
    Alors effectivement en retirant les * cela fonctionne

    Il passe bien dans la boucle 2 fois mais il ne comptabilise toujours pas les nombres de répertoire et de fichiers..

    J'ai remarqué que si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fichier $chemin/$1/*.*
    ça ne marche pas,pourquoi ? Cette ecriture diffère telle de celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fichier $chemin/$1/*
    Je travaille sur putty (pour information) et j'ai déjà utilisé des expr et cela marche >.< !

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Par défaut
    *.* ne marche que si ton nom de fichier contient un point.

    Ta variable $fichier contient le nom absolu de ton fichier. Elle seule doit apparaître dans tes tests (voir mon code).

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 639
    Par défaut
    j'ai déjà utilisé des expr et cela marche >.< !
    je n'ai pas dit que ça ne pouvait pas fonctionner.
    j'ai dit qu'il est inutile d'appeler un programme externe, quand le shell peut le faire au moins aussi bien.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut
    Citation Envoyé par mvvvv Voir le message
    *.* ne marche que si ton nom de fichier contient un point.

    Ta variable $fichier contient le nom absolu de ton fichier. Elle seule doit apparaître dans tes tests (voir mon code).

    Citation Envoyé par N_BaH Voir le message
    je n'ai pas dit que ça ne pouvait pas fonctionner.
    j'ai dit qu'il est inutile d'appeler un programme externe, quand le shell peut le faire au moins aussi bien.
    Ok j'ai compris ! Et tout fonctionne !

    Merci pour votre aide !

    Amicalement crodilus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/08/2009, 01h55
  2. Réponses: 6
    Dernier message: 29/03/2007, 14h18
  3. Réponses: 11
    Dernier message: 16/03/2007, 11h04
  4. Réponses: 3
    Dernier message: 03/10/2006, 19h33
  5. pourquoi mon quickreport n'affiche rien ?
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 8
    Dernier message: 31/07/2005, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo