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 :

grep puis test variable


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut grep puis test variable
    Bonjour

    lorsque le grep trouve la valeur pas de problème par contre si il n'y a aucune correspondance le script ne fait rien ?

    fichier listecopieurs.txt
    COPI-101-1-Dir;Photocopieur;192.168.1.1;00:00:74:48:A8:A1
    COPI-101-2;-Photocopieur;192.168.1.2;00:00:74:48:A8:AD
    COPI-101-ACHATS;Photocopieur;192.168.1.3;00:00:74:48:A8:A2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/bash
    set -e
    themac=$1
     
    listeimp=$(grep -i "${themac}" listecopieurs.txt)
    if [ -n "${listeimp}" ] ; then
            echo "liste pleine : $listeimp"
             resultatIMP=1
     else
             echo "liste vide"
             resultatIMP=0
     fi
    je ne vois pas mon erreur ?

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Commente ton set -e et ça devrait aller mieux

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci pour ta réponse , effectivement cela fonctionne

    j'aimerai avoir un complément d'information

    la commande set -e = provoque une sortie immédiate si toute commande simple produit une erreur.

    pourquoi ma commande provoque une erreur que lorsque le grep ne trouve rien ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listeimp=$(grep -i "${themac}" listecopieurs.txt)

  4. #4
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par plnew Voir le message
    la commande set -e = provoque une sortie immédiate si toute commande simple produit une erreur.

    pourquoi ma commande provoque une erreur que lorsque le grep ne trouve rien
    Parce que si tu testes le code retour de ta commande (echo $?), tu t'apercevras qu'il est égal à "1", autrement dit à "faux".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ echo "Bonjour" | grep -q 'j'
     
    $ echo $?
    0
     
    $ echo "Bonjour" | grep -q 'a'
     
    $ echo $?
    1
     
    $

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    merci pour l'explication

    y a t-il un moyen de contourner cette effet
    car si grep répond 1 en code retour parce qu'il ne trouve rien , ce n'est pas pour moi une
    erreur comme si la commande c'etait mal passée

    question : a quelle moment utilise t-on le "set -e" ?

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    la commande set -e = provoque une sortie immédiate si toute commande simple produit une erreur.
    En fait non, la commande set -e ne provoque pas une sortie immédiate si toute commande simple produit une erreur, mais un code retour différent de zéro, ce qui n'est pas pareil.


    car si grep répond 1 en code retour parce qu'il ne trouve rien , ce n'est pas pour moi une erreur comme si la commande c'etait mal passée
    C'est vrai, mais comme dit au-dessus, c'est le fait que le code retour soit différent de zéro qui provoque l'arrêt du script


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    question : a quelle moment utilise t-on le "set -e" ?
    Comme avec les options "x" et/ou "v" de la commande "set", à des fins de débogage, mais en tenant bien compte des deux remarques ci-dessus (code retour différent de zéro).

    Après la question serait plutôt : Pourquoi avais-tu mis cette commande dans ton script ? Qu'en attendais-tu ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    comme je pensais que le set -e arrêtait le script pour une erreur cela me permettait de voir dès qu'il y avait un problème.

    Ton explication est très claire, je ne peux plus mettre le set -e dans mes scripts si j'ai une commande qui peut retourner une valeur différente de 0.


    encore merci pour le temps passé

  8. #8
    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 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par plnew Voir le message
    Ton explication est très claire, je ne peux plus mettre le set -e dans mes scripts si j'ai une commande qui peut retourner une valeur différente de 0.
    Surtout qu'il n'y en n'a pas qu'une !!!
    • ls retourne 1 si on l'applique sur un nom de fichier présumé et qu'il n'existe pas
    • expr retourne 1 si elle affiche 0
    • false retourne systématiquement 1
    • sans oublier test qui retourne 1 si l'évaluation demandée est fausse

    ...

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par plnew Voir le message
    comme je pensais que le set -e arrêtait le script pour une erreur cela me permettait de voir dès qu'il y avait un problème.

    Ton explication est très claire, je ne peux plus mettre le set -e dans mes scripts si j'ai une commande qui peut retourner une valeur différente de 0.


    encore merci pour le temps passé
    Si, tu peux continuer à mettre set -e au début de tes scripts, à condition d'encadrer chaque appel qui peut retourner autre chose que 0 entre set +e et set -e !!!
    et attention à bien capturer les $? au bon moment!
    J'avoue que ce n'est pas très commode, mais ça peut servir!

  10. #10
    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 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Si, tu peux continuer à mettre set -x au début de tes scripts, à condition d'encadrer chaque appel qui peut retourner autre chose que 0 entre set +x et set -x !!!
    et attention à bien capturer les $? au bon moment!
    set -e !!!

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par plnew Voir le message
    comme je pensais que le set -e arrêtait le script pour une erreur cela me permettait de voir dès qu'il y avait un problème.

    Ton explication est très claire, je ne peux plus mettre le set -e dans mes scripts si j'ai une commande qui peut retourner une valeur différente de 0.
    Bonjour,

    je viens de trouver quelque chose d'intéressant dans le man en rapport avec le set -e et qui semble le rendre utilisable!

    Je ne sais pas pour quels shells c'est valable! Apparemment, au moins pour le bash (car mon man set m'affiche les BASH_BUILTINS(1)) et pour le pdksh (d'après mon man ksh).

    Je n'ai rien trouvé dans la "bible" (Le KornShell, Bolsky & Korn). ça ne fonctionne donc peut-être pas pour des ksh autres que le pdksh (mais j'en doute (je n'ai pas la possibilité de le tester maintenant (mon mac est à la maison))):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ echo $BASH_VERSION
    3.2.25(1)-release
    $ echo $KSH_VERSION
    @(#)PD KSH v5.2.14 99/07/13.2
    $ man set
    [snip]
    -e Exit immediately if a simple command (see SHELL GRAMMAR  above)
       exits  with  a non-zero status.  The shell does not exit if the
       command that fails is part of the command list immediately fol-
       lowing  a  while  or  until  keyword, part of the test in an if
       statement, part of a && or || list, or if the command’s  return
       value  is being inverted via !.  A trap on ERR, if set, is exe-
       cuted before the shell exits.
    Du coup, ça rend le set -e tout à fait utilisable!
    En effet, il suffit effectivement de tester le retour de chaque fonction!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     #!/bin/bash
    set -e
    themac=$1
     
    if listeimp=$(grep -i "${themac}" listecopieurs.txt) ; then
            echo "liste pleine : $listeimp"
            resultatIMP=1
    else
            echo "liste vide"
            resultatIMP=0
    fi
    Par contre, on ne peut plus écrire le traditionnel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ma_fonction; res=$?
    if [[ $res -ne 0 ]]; then yaunblem ; fi
    Il faut écrire (pour les shells qui connaissent le '!'):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ! ma_fonction; then yaunblem ; fi
    ou (pour les shells qui ne connaissent pas le '!'):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ma_fonction; res=$?; [[ $res -ne 0 ]]; then yaunblem ; fi
    Cette perspective m'ouvre de nouveaux horizons...
    )jack(

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

Discussions similaires

  1. Stockage commande grep dans une variable puis affichage
    Par Isabella83 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 23/04/2015, 11h13
  2. Grep, Regexp et variables
    Par 84mickael dans le forum Linux
    Réponses: 6
    Dernier message: 25/07/2007, 17h39
  3. [Tableaux] Test variable à vide
    Par hari37 dans le forum Langage
    Réponses: 9
    Dernier message: 18/12/2006, 20h51
  4. Cherche test variable numerique
    Par nenekes dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/11/2006, 09h48
  5. test variable vide
    Par vince2005 dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2006, 15h00

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