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 :

Boucle while read


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Points : 12
    Points
    12
    Par défaut Boucle while read
    Bonjour, alors voilà je suis en train de réaliser un petit programme qui doit me permettre de cartographier des routeurs
    je récupère ces routeur via la commande traceroute or j'aimerais créer un dossier pour chaque nom de routeur avec dedans un lien qui pointerais vers le dossier suivant ( soit le routeur suivant)

    donc j'ai un code des cette forme la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    cat monfichier.txt | while read arg1 arg2 arg3 arg4; do
       if [ ma_condition ]; then  instruction
           else
              mkidir $arg2$arg3
       fi
     
    done
    ici $arg2 et $arg3 corresponde au nom du routeur et dans ma logique j'aimerais faire un cd $arg2$arg3 et ensuite créer un lien pointant vers l'itération suivante. sauf que je ne sais pas comment lui dire de faire sa.

    si quelqu'un à une piste à me transmettre ou une idée d'une meilleur solution , je le remercie par avance.

    Cordialement

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    ce n'est évidemment pas possible : la donnée suivante n'est connue que lorsqu'elle est devenue la donnée courante !
    il faut donc retourner le problème, et traiter la donnée précédente avec la donnée courante.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    d'accord mais le problème reste le même comment en ayant parcouru les lignes de mon fichier lui dire d'utiliser la donnée de l'itération d'avant ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    c'est à cela que servent les variables : conserver des données pour un usage ultérieur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do test -n "$prec" && echo "courante = $line ;; précédente = $prec"; prec="$line"; done < fichier
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    d'accord je comprend a peu pres le principe ya juste la partie
    qui est un peu obscur. vous pouvez m'expliciter le -n ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par IfyouChaos Voir le message
    ya juste la partie
    qui est un peu obscur. vous pouvez m'expliciter le -n ?
    Bien sûr qu'on peut t'expliquer ce que fait test -n...
    Mais je dirais que l'on n'est jamais si bien servi que par soi-même
    Donc un man test s'impose...
    voire un man test | fgrep -e '-n'

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Bonsoir, alors pour moi le test -n $prec verifie si la longueur de la chaine de caracter dans la variable $prec n'est pas 0.

    bon ensuite j'ai mis en application le bout de code que vous m'avez donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do test -n "$prec" && echo "courante = $line ;; précédente = $prec"; prec="$line"; done < fichier
    les dossiers portant les noms des routeurs sont bien créés mais les liens pointent vers le routeur précédent; bon logique jusque là, mais comme je veux partir du premier routeur traversé et non du dernier j'ai voulu inverser en faisant quelque chose comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    cat fichier.txt | while read  arg1 arg2 arg3 arg4; do
              if [ ma_condition ]
    		then 
                            instruction
    		else 
    			mkdir $arg2$arg3
    			test -n "$prec" && echo "courante = $arg2$arg3 ;;  précédente = $prec"; courante=$arg2$arg3 precedent=$prec ; prec="$arg2$arg3";
    			cd $precedent
    			creation des liens vers $courante
    			cd ../
     
    	   fi
    sauf que la il me dit qu'il ne peut créer le dossier puisque le dossier est déjà existant ! or j'ai vérifier en mettant des echo un peu partout et il prend bien les valeurs voulu et qui sont bien différente, mais j'ai l'impression qu'il essaye quand meme de créer toujours le premier dossier de la premiere itération qui lui est le seul à être créé.

    à noter que si je remplace le cd $ precedent par $prec il créer bien tout les dossier mais les liens pointent vers les routeurs précédents !

    auriez-vous une idées d'où peut venir le problème ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unset prec
    while read serveur
    do
       if test -n "$prec"
       then
          echo "mkdir $prec $serveur"
          echo "ln $serveur $prec/$serveur"
       fi
       prec="$serveur"
    done < serveurs.list
    il est utile d'écrire ce que tu veux faire (opération par opération) avant de coder !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par IfyouChaos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    			cd $precedent
    			creation des liens vers $courante
    			cd ../
    sauf que la il me dit qu'il ne peut créer le dossier puisque le dossier est déjà existant... à noter que si je remplace le cd $ precedent par $prec il créer bien tout les dossier mais les liens pointent vers les routeurs précédents !
    Bonjour

    Déjà tu n'es pas obligé de descendre dans un dossier pour y créer des liens: ln -s chemin_vers_dossier_1_a_partir_du_dossier_2/fichier_origine dossier2/lien fonctionne parfaitement d'où que tu te trouves dans l'arborescence. La seule obligation est de vérifier, étant donné que le lien sera lu depuis le dossier2, que le chemin vers le dossier 1 est bien référencé comme étant vu depuis le dossier 2.

    Ensuite ben comme l'a dit N_Bah: commence par établir ce que tu veux faire avant de tenter de le faire faire par le shell. Et vérifie aussi le sens de ta commande ln. Le premier argument est le fichier à l'origine du lien ; le second est le fichier lié...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et vérifie aussi le sens de ta commande ln. Le premier argument est le fichier à l'origine du lien ; le second est le fichier lié...
    Mnémotechnique: en ce qui concerne les arguments, "ln" est semblable à "cp":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cp truc_existant_a_copier truc_n_existant_pas_encore
    ln truc_existant_a_lier truc_n_existant_pas_encore
    D'ailleurs, lorsque le basename du truc à lier est identique et qu'on est dans le répertoire cible, on peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln chemin/relatif/ou/absolu/vers/truc_existant_a_lier .

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    D'ailleurs, lorsque le basename du truc à lier est identique et qu'on est dans le répertoire cible, on peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln chemin/relatif/ou/absolu/vers/truc_existant_a_lier .
    Pas forcé de se trouver dans le dossier cible

    De façon très générale, et tout comme pour un cp ou un mv, lorsque le basename du truc à lier est identique mais qu'il sera donc placé dans un autre dossier que le fichier source, on peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln chemin/relatif/ou/absolu/vers/truc_existant_a_lier dossier_de_destination
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Merci pour toutes ces réponses très utiles en tout cas de mon coté tout marche nickel chrome =)

    concernant le fait que je descend dans les dossiers pour créer mes liens, je sais que je n'y suis pas obligé, mais ça me permet de décomposer étant donné que je suis pas forcément très à l'aise avec le bash même si finalement j'aime bien codé dans ce langage. maintenant que tout marche je vais pouvoir le faire justement ;-)

    et merci pour le conseil mémotechnique car à chaque fois je cherche a quelle position doit être le dossier source et la destination.

    merci beaucoup.

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Citation Envoyé par jack-ft Voir le message
    Mnémotechnique: en ce qui concerne les arguments, "ln" est semblable à "cp":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cp truc_existant_a_copier truc_n_existant_pas_encore
    ln truc_existant_a_lier truc_n_existant_pas_encore
    D'ailleurs, lorsque le basename du truc à lier est identique et qu'on est dans le répertoire cible, on peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln chemin/relatif/ou/absolu/vers/truc_existant_a_lier .
    Je sais que beaucoup de gens utilisent ce moyen mnémotechnique pour "ln", mais je n'arrive pas à comprendre d'où vient ce problème avec ln, car comme toutes les commandes, il est dans le sens "source" "destination".
    Peut-être à cause du fait que la "destination" n'est pas toujours obligatoire, la syntaxe suivante est valide si on est dans le répertoire cible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln chemin/relatif/ou/absolu/vers/truc_existant_a_lier
    Cordialement.

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Peut-être à cause du fait que la "destination" n'est pas toujours obligatoire, la syntaxe suivante est valide si on est dans le répertoire cible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln chemin/relatif/ou/absolu/vers/truc_existant_a_lier
    Bizarre. Effectivement ça fonctionne mais si on m'avait demandé avant que je teste j'aurais juré que ça ne fonctionnerait pas. Car pour cp ou mv, ce genre de syntaxe ne fonctionne absolument pas. Pour ces deux autres commandes, il faut impérativement nommer la cible, que ce soit un fichier ou un dossier. Et comme ln s'utilise de la même façon que cp ou mv, je pensais que pour ln il fallait aussi nommer expressément une cible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. boucle while read line
    Par tibal dans le forum Linux
    Réponses: 0
    Dernier message: 25/09/2008, 14h44
  2. Pb. ac un "read" dans une boucle de type "while read"
    Par florant23 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/05/2008, 10h23
  3. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 15h38
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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