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 :

Stocker le résultat d'une commande


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut Stocker le résultat d'une commande
    Hello,
    je souhaite réaliser un script bash (je débute...) qui cherche simplement l'occurence d'un mot dans certains fichiers et qui ensuite déplace ces fichiers.
    Mon pb est le suivant: je souhaite stocker le résultat d'une commande dans une variable ms je ne trouve pas comment faire. Pour le moment j'ai le petit script suivant, qui ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/usr/local/bin/bash -norc
    for i in `ls | grep .gen`
    do
           res=`grep bact $i` # pb
     
           if test $res = bact
           then
                    mv $i bact_f/
           fi
    done
    La variable res semble ne pas stocker le résultat... Si quelqu'un peut me mettre sur la voie pr stocker le résultat d'une commande...

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Citation Envoyé par vinzzzz
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/local/bin/bash -norc
    for i in `ls | grep .gen`
    do
           res=`grep bact $i` # pb
     
           if test $res = bact
           then
                    mv $i bact_f/
           fi
    done
    La variable res semble ne pas stocker le résultat... Si quelqu'un peut me mettre sur la voie pr stocker le résultat d'une commande...
    En es tu vraiment sûr ? As tu tenté un "echo $res" juste après l'affectation ?
    Les back-quotes sont pourtant l'opérateur "old-school" qui permet de faire ce que tu souhaite.
    La nouvelle syntaxe POSIX, à privilégier, est cependant $( ) plutôt que ``.

    On devrait donc pouvoir écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/local/bin/bash -norc
    for i in $(ls | grep .gen)
    do
           res=$(grep bact $i) # pb
    echo "res vaut [$res]"
     
           if test $res = bact
           then
                    mv $i bact_f/
           fi
    done
    Par ailleurs, ton test, dans le if, ne me paraît pas forcément pertinent.
    Pourquoi ne pas te baser simplement sur le code de retour du grep ? Il vaut 0 en cas de succès du grep, 1 en cas d'échec (et 2 en cas d'erreur).


    Bon courage,

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Par ailleurs, ton test, dans le if, ne me paraît pas forcément pertinent.
    Pourquoi ne pas te baser simplement sur le code de retour du grep ? Il vaut 0 en cas de succès du grep, 1 en cas d'échec (et 2 en cas d'erreur).
    Oui il n'est pas vraiment pertinent, même si dans l'exercice que j'ai a faire il fonctionne... Je sais pas comment tester si la commande a marché ou si la chaine est nulle.
    J'ai regardé un petit peu sur internet et j'ai trouvé la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if [-n "$res"]  # Si la chaine est non nulle
    then
    	mv $i virus_file/
    fi
    Mais ca semble ne pas passer: le shell me renvoie "[ -n commande introuvable"...
    Comment récupérer le code de retour du grep?

    MErci a toi de ta réponse en tout cas

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Ok c'est bon, j'ai trouvé, dans l'exemple qu'on me donnait sur internet ils avaient oublié le mot test, et les crochets semble également être de trop.
    Le test donne ceci finalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if test -n "$res"  # Si la chaine est non nulle
    then
    	mv $i virus_file/
    fi
    Merci a toi en tout cas. Juste, pr finir, j'ai testé si la chaine était nulle ou non, est-ce ce que tu voulais me faire faire? Si non, peut tu me dire comment récupérer le code de retour de grep?

  5. #5
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Citation Envoyé par vinzzzz
    Ok c'est bon, j'ai trouvé, dans l'exemple qu'on me donnait sur internet ils avaient oublié le mot test, et les crochets semble également être de trop.


    test et crochets sont synonymes.
    Par contre, les crochets doivent être séparés de tout autre texte par un blanc. Il faut donc écrire Et comme je l'ai dit, pourquoi ne pas se baser tout simplement sur le code de retour de grep ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if grep montexte monfichier ; then
       echo "J'ai trouvé ..."
    fi
    Sinon, après l'exécution de chaque commande, chaque code de retour se trouve dans la variable $?

    Bon courage.

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    test et crochets sont synonymes.
    Par contre, les crochets doivent être séparés de tout autre texte par un blanc. Il faut donc écrire
    Ok je pense que j'avais pas mis les espaces...
    Pr le retour du grep, je me serai basé dessus si j'avais su comment faire
    Maintenant c'est le cas.

    Juste pr vérifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if grep montexte monfichier ; then
       echo "J'ai trouvé ..."
    fi
    est donc équivalent a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if $? -eq 1 
    then
       echo "J'ai trouvé ..."
    fi

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

Discussions similaires

  1. [Free Pascal] Stocker des sous-parties d'une chaîne : isoler les paramètres d'une commande
    Par eldoir dans le forum Free Pascal
    Réponses: 3
    Dernier message: 07/03/2012, 05h23
  2. Réponses: 0
    Dernier message: 02/04/2011, 12h57
  3. Passage d'une commande à un programme
    Par nicolas.pissard dans le forum C++Builder
    Réponses: 5
    Dernier message: 04/11/2003, 13h37
  4. Réponses: 2
    Dernier message: 24/06/2003, 20h31
  5. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36

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