Forum Programmation.shell Test si le retour d'un grep est vide, erreurs.

Posté par  .
Étiquettes : aucune
0
5
juin
2007
Bonjour,

Je cherche à tester si le retour d'un grep est vide, je fait ça comme suit :

#!/bin/sh
test=`cat vm-state | grep on`

if [ -z "$test" ] || [ $test = " " ] || [ $test = "" ]
then
echo "la chaine est vide"
else
echo "la chaine n'est pas vide : $test"
fi


Dans le cas ou rien n'est retourné par le grep ça fonctionne, par contre, dans le cas ou le grep trouve des correspondances, j'obtiens deux messages d'erreur ( [: too many arguments )

Je m'y prends mal ?
  • # en fait non ..

    Posté par  . Évalué à 1.

    Finalement, la solution aura été de tester simplement si la chaine est vide
    if [ -z "$test" ]

    Etrange, il me semblais que ça ne marchais pas auparavant ..
    • [^] # Re: en fait non ..

      Posté par  (site web personnel) . Évalué à 1.

      Sinon on citera également la possibilité de tester non pas directement le résultat de grep, mais le résultat de grep redirigé vers un "wc -l" qui lui retourne invariablement un entier.
    • [^] # Re: en fait non .. => Pour info

      Posté par  . Évalué à 1.

      Bonjour,

      L'opérateur "-z" est le bon :-)

      Mais si dans le résultat de ta commande tu as des caractères de type "[[:blank:]]" (espace, tabulation, ...) ou saut(s) de ligne, il te faudrait aussi les retirer, par exemple en amont avec un | egrep -v '^$|^[[:blank:]]+$' (ou tout autre expression egrep :P).

      Pour info, je crois que les erreurs de tes premières expériences viennent des autres tests:

      [ $test = " " ] || [ $test = "" ]

      En effet, quand le contenu de "test" n'est pas vide, il peut être formé de plusieurs "mots" (au sens plusieurs chaînes de caractères séparées par des caractères type [[:blank:]] ou saut(s) de ligne).
      Qui dit "mots" non "quotés" dit arguments d'appel de la commande (et oui '[' est une commande :P), d'où le "too many arguments".

      Un petit conseil: utiliser une option de debug (sous Bash & co, c'est "-x" ce qui donne bash -x script.sh à l'appel).
      C'est verbeux, mais quand on s'y habitue (surtout à la manière dont disparaisse les fameux "quotes" à l'affichage :P), c'est pratique.

      Et voilà !

      Cdlt,

      PS: Dernière truc, encore plus sioux, utiliser egrep pour le test.
      C'est gourmand, c'est ce que l'on veut, mais ça le fait aussi :D


      # J'utilise cette syntaxe car je suppose que la variable test est utilisee
      # par la suite sinon, on le place directement dans l'appel d'avant :P
      echo $test | egrep -q "up"
      if [ ${?} -eq 0 ]; then
      # Testez moi :D
      else
      # Testez moi :D
      fi
      • [^] # Re: en fait non .. => Pour info

        Posté par  . Évalué à 1.

        Pour l'astuce du débug sous bash, c'est effectivement très utile :)

        Sinon, je ne pensais pas à tester les '[[:blank:]]" et autres joyeusetées, je le saurais pour la suite !

        Merci d'avoir pris du temps pour m'expliquer tout ca !
    • [^] # Re: en fait non ..

      Posté par  . Évalué à 3.

      Et le code retour de grep, ca ne convient pas?

      Sous Solaris 8:

      EXIT STATUS
      The following exit values are returned:

      0 One or more matches were found.

      1 No matches were found.

      2 Syntax errors or inaccessible files (even if matches
      were found).
  • # argument -q (quiet) de grep

    Posté par  . Évalué à 4.


    grep -q on vm-state

    if [ $? == 0 ]
    then
        echo "ligne trouvee"
    else
        echo "ligne non trouvee"
    fi
    • [^] # Re: argument -q (quiet) de grep

      Posté par  . Évalué à 2.

      c'est la solution qui corresponds le plus a mes attentes en fin de compte :)

      J'avais pas été faire un tour par le manpage de grep, ya tout plein d'options interessantes, c'est super pratique !
      • [^] # Re: argument -q (quiet) de grep

        Posté par  . Évalué à 1.

        Et comment je devrais faire si je ne veux pas utiliser le retour de la commande pécédente ($?) mais inclure directement cette commande dans le test ?

        Quelque chose dans ce style (mais évidement pas comme ca ..):

        if [ `grep -q $1 vm-state` == 0 ]
        then
        echo "ligne trouvée"
        else
        echo "ligne non trouvée"
        fi
        • [^] # Re: argument -q (quiet) de grep

          Posté par  . Évalué à 1.

          Soit tu utilise "-c" comme expliqué plus haut :


          if [ `grep -c on $1` == 0 ]
          then
              echo "ligne non trouvee"
          else
              echo "ligne trouvee"
          fi


          Soit tu fais qqchose comme ça :


          trouve() {
              echo "trouvee"
          }

          nontrouve() {
              echo "non trouvee"
          }

          grep -q on $1 || nontrouve
          grep -q on $1 && trouve


          Les fonctions doivent être définies avant les appels.
        • [^] # Re: argument -q (quiet) de grep

          Posté par  (site web personnel) . Évalué à 5.

          if  grep -q $1
          then
            echo "ligne trouvée"
          else
            echo "ligne non trouvée"
          fi

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.