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

Linux Discussion :

[KSH] récuperer le resultat d'une ligne dans une variable.


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut [KSH] récuperer le resultat d'une ligne dans une variable.
    Bonjour.

    je dispose d'un fichier TAR qui va être détarré dans le répertoire ou il se trouve.
    je souhaiterai vérifier l'intégrité des fichiers détarrer.

    je pensais faire :
    je pensais alors récupérer dans une variable la taille du fichier (var1) et dans une deuxième variable son nom (var2). ensuite pour chaque ligne (ou j'ai donc mes 2 variable renseigner) je vais rechercher dans le répertoire mon fichier (var2) et comparer var1 à la taille du fichier trouver.

    Pour le moment j'avais fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    listTarFile=$(tar -tvf monFicher.tar |awk '{print $3 " " $6}'
    for elem in ${listTarFile}
            do
    ...
            done
    le probleme c'est que ma variable $elem est égale :
    au premier coup, a la taille du fichier
    au deuxième cou au nom
    au troisième cou à la taille
    ...

    En résumé pour le moment je récupère un élément et non la ligne que je souhaite

    Comment puis-je réaliser ceci?

    Je vous remercie d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par livinho38 Voir le message
    listTarFile=$(tar -tvf monFicher.tar |awk '{print $3 " " $6}'
    for elem in ${listTarFile}
    do
    ...
    done

    le probleme c'est que ma variable $elem est égale :
    au premier coup, a la taille du fichier
    au deuxième cou au nom
    au troisième cou à la taille
    Salut

    C'est normal puisque le "for" se cale sur l'espace pour détecter chaque élément. C'est fait pour gérer des éléments simples
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in 1 2 3 4 5
    et non des éléments complexe comme
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    for ligne in phrase 1 phrase 2 phrase 3
    !!!

    Pour y arriver, il te faut utiliser un outil qui sache ce qu'est une ligne. Et c'est quoi une ligne ? C'est des caractères terminés par <return>. Et quel outil se cale sur le <return> pour travailler ? Le read

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tar -tvf monFicher.tar |awk '{print $3 " " $6}' |while read elem
    do
    ...
    done

    Et tu peux même récupérer directement tes éléments distincts
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tar -tvf monFicher.tar |awk '{print $3 " " $6}' |while read nom taille
    do
    ...
    done

    Citation Envoyé par livinho38 Voir le message
    je dispose d'un fichier TAR qui va être détarré dans le répertoire ou il se trouve.
    Absolument pas.
    Ca ne dépend que
    1) de la façon dont ont été stockés les fichiers lors de la création du tar (nom relatif/nom absolu)
    2) de l'endroit où toi tu te trouves quand tu lances le détarrage
    et absolument pas de l'endroit où se trouve le fichier tar.

    Si celui qui a créé le tar a archivé "/home/machin", alors le fichier tar peut se trouver dans /tmp, les fichiers seront détarrés dans /home/machin.

    Inversement, si celui qui a créé le tar a archivé "../truc", ben même si le fichier tar se trouve dans /tmp mais que toi tu te trouves dans /home/machin quand tu lances le détarrage, alors les fichiers seront détarrés dans /home/machin/../truc (autrement dit /home/truc)...

    Cela peut être dangereux c'est pourquoi les tar modernes enlèvent le "/" lors de l'archivage mais tous les tar ne sont pas forcément modernes...
    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]

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    Envoyé par livinho38 Voir le message
    je dispose d'un fichier TAR qui va être détarré dans le répertoire ou il se trouve.
    ceci était juste à titre indicatif dans mon cas je m'y connais pas spécialement en bash donc je préférer détailler au mieux mon problème

    Sinon merci beaucoup j'ai donc utiliser la méthode :
    tar -tvf monFicher.tar |awk '{print $3 " " $6}' |while read nom taille
    do
    ...
    done
    C'est exactement ce que je voulais.

    Merci Beaucoup pour le détail et la rapidité de réponse!!

  4. #4
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    Autre petite question, comment puis-je récupérer une variable qui est mise dans le while ?

    car quand je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tar -tvf monFicher.tar |awk '{print $3 " " $6}' |while read nom taille
    do
    maVariable=1
    done 
    echo maVariable
    ma variable n'existe pas (si je l'ai défini avant le while alors elle a la valeur initiale.

    j'ai essayé des solution tel que le export, ou de séparer mon while de la condition, de cette façon :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read nom taille
    do
    maVariable=1
    done < $(tar -tvf monFicher.tar |awk '{print $3 " " $6}' )
    echo maVariable
    mais la je n'obtiens plus du tout le bon résultat.
    (la solution des parenthèse ne me convient pas dans mon cas puisque la variable est utiliser + tard et non juste derrière comme dans l'exemple.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par livinho38 Voir le message
    ceci était juste à titre indicatif dans mon cas je m'y connais pas spécialement en bash
    En fait, c'est pas du bash mais de la manipulation de fichiers. Savoir comment repérer un fichier dans l'arborescence indépendamment de (ou en relation avec) ta propre position. Et savoir gérer quand les noms de fichiers dépendent eux-mêmes d'un autre fichier (comme avec un tar ou avec un lien symbolique)...

    Citation Envoyé par livinho38 Voir le message
    Autre petite question, comment puis-je récupérer une variable qui est mise dans le while ?

    car quand je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tar -tvf monFicher.tar |awk '{print $3 " " $6}' |while read nom taille
    do
    maVariable=1
    done 
    echo maVariable
    ma variable n'existe pas (si je l'ai défini avant le while alors elle a la valeur initiale.
    C'est le problème du pipe. Il génère un processus fils totalement distinct et malheureusement ta variable située dans le sous-processus n'est qu'une copie de celle initiée avant le while.

    Citation Envoyé par livinho38 Voir le message
    j'ai essayé des solution tel que le export
    L'export est fait pour attribuer aux processus fils futurs et séparés (un autre shell, un autre programme) une copie de la variable. Et non pour faire remonter une variable du fils vers le père.

    Citation Envoyé par livinho38 Voir le message
    , ou de séparer mon while de la condition, de cette façon :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read nom taille
    do
    maVariable=1
    done < $(tar -tvf monFicher.tar |awk '{print $3 " " $6}' )
    echo maVariable
    mais la je n'obtiens plus du tout le bon résultat.
    Normal. Le signe "<" indique que les données à traiter seront prises dans un fichier et non dans stdin.
    Citation Envoyé par livinho38 Voir le message
    (la solution des parenthèse ne me convient pas dans mon cas puisque la variable est utiliser + tard et non juste derrière comme dans l'exemple.
    S'il n'y a pas de pipe alors ta variable est disponible où tu veux (300 lignes plus bas si tu en as envie).

    Concernant ton problème, tu as plusieurs solutions qui ont chacune des avantages et des inconvénients
    1) tu groupes les sous-processus
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    tar -tvf ... | (
        while read ligne
        do
           ....
           maVariable=...
           ...
        done
        ...
        ...
        echo $maVariable
    )
    Inconvénient: tu ne fais que reculer l'échéance et une fois la parenthèse fermée, ta variable disparait.

    2) tu utilises une fonction qui englobe l'algo et qui t'affiche ce dont tu as besoin. Puis tu récupères ce qui a été affiché
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    func()
    {
       tar -tvf ... | while read ligne
       do
          ....
          ...
          echo résultat
       done
    }
    maVariable=$(func)
    Inconvénient: rajoute un echo de debug et tu comprendras ta douleur...

    3) tu remplaces le flux entrant par un fichier
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    tar -tvf ... >~/tmp/fic$$
    while read ligne
    do
       ....
       maVariable=...
       ...
    done <~/tmp/fic$$
    rm -f ~/tmp/fic$$
    ...
    ...
    echo $maVariable
    Inconvénient: attention aux collisions (si ton script est lancé plusieurs fois, il ne faut pas que le fichier de travail généré par le process1 soit écrasé par celui du process2 d'où l'utilisation de "$$" dans le nom du fichier). Et tout fichier disque alourdit le processus

    Petite variante (qui ne change rien aux inconvénients ci-dessus)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tar -tvf ... | (
        while read ligne
        do
           ....
           ...
        done
        echo résultat >~/tmp/fic$$
    )
    maVariable=$(cat ~/tmp/fic$$)
    rm -f ~/tmp/fic$$
    ...
    ...
    echo $maVariable


    4) modifier l'IFS pour que le for se cale sur la fin de ligne et non l'espace mais là je sais pas trop faire (j'ai horreur de toucher à l'IFS car trop de trucs en dépendent).
    Ca pourrait être un truc dans ce genre
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    old="$IFS"
    IFS="\n"
    for ligne in $(tar -tvf ...)
    do
       ....
       maVariable=...
       ...
    done
    IFS="$old"
    unset old
    echo "$maVariable
    Inconvénient: dans la boucle, tu as perdu l'IFS d'origine et ce qui va avec (problèmes dans les if, les for, les while internes). Comme je te l'ai dit, je trouve hyper dangereux de toucher à ça...
    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]

Discussions similaires

  1. Réponses: 15
    Dernier message: 21/10/2009, 13h31
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  4. [MySQL] inserer une ligne d'une table dans une autre table
    Par piero53 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/12/2008, 18h29
  5. Réponses: 3
    Dernier message: 29/01/2008, 12h08

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