Forum Linux.débutant script tout simple

Posté par  .
Étiquettes : aucune
0
10
août
2004
Bonjour
Je suis en train de me prendre la tête sur ce tout petit script et je ne comprend pas pourquoi lorsque $Erreur=1, il ne passe pas dans la première condition (il y a toujours au moins 1 ligne d'information dans mon fichier "erreur".)

Erreur=$(cat /home/erreur | wc -l)
case $Erreur in
1)
echo La sauvegarde de SERVER effectuée >> /var/log/save.log ;;
*)
cat /home/erreur >> /var/log/save.log
echo Problème de sauvegarde sur SERVER | smbclient -M ADMINISTRATEUR ;;
esac
En affectant Erreur=1, ça marche...
Comprend pas....:(
  • # pourquoi $(...) ?

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

    si tu mets un echo "bla bla $Erreur" juste avant ton case tu verrais que Erreur ne vaut pas 1..
    essaye plutot
    Erreur=`cat /home/erreur | wc -l`

    PS: ` = altgr + 7
    • [^] # Re: pourquoi $(...) ?

      Posté par  . Évalué à 1.

      Je te remerci mais si $Erreur vaut bien 1.
      Ta ligne donne le même résultat (1) mais le case s'en tape toujours....:(
  • # Debugage

    Posté par  . Évalué à 1.

    Je te conseil d'afficher la valeur de ta variable aprés affectation.
    Donc :

    Erreur=$(cat /home/erreur | wc -l)
    echo $Erreur

    Ca te permettra de savoir si ton erreur se situe au niveau de l'affectation ou dans le `case`

    Tu pourra enlever l'echo une fois que ton script marchera
  • # Détails

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

    cat /home/erreur | wc -l

    donne le même résultat que
    wc -l /home/erreur


    il y a toujours au moins 1 ligne d'information dans mon fichier "erreur"
    As tu essayé un echo $Erreur voir la valeur ?

    Et sinon, pourquoi faire un case quand tu n'as que 2 cas ?
    • [^] # Re: Détails

      Posté par  . Évalué à 1.

      Mlerci, j' ai déjà vérifier avec echo et $Erreur a bien la valeur 1
      Autrement 'case' car dans un avenir proche j'aurai d'autres conditions.
  • # Et les " "

    Posté par  . Évalué à 1.

    euh ...
    case $Erreur in

    "1")

    Il me semble que case traite des chaines de caractère, mais je ne suis pklus très sur.
    • [^] # Re: Et les " "

      Posté par  . Évalué à 1.

      Toujours pas j'ai essayé mais ça veut pas...
      • [^] # Re: Et les " "

        Posté par  . Évalué à 1.

        T'as vérifié s'il n'y avait pas un espace ou autre caractère non affichable (que donne par exemple "cat $Erreur | wc -c?")
    • [^] # Re: Et les " "

      Posté par  . Évalué à 1.

      D'après http://dpobel.free.fr/man/html/affiche_man.php?id=105(...)

      case mot in [ motif [ | motif ] ... ) liste ;; ] ... esac
      successivement avec chacun des motifs en utilisant
      les mêmes règles de correspondance que pour les
      expansions de noms de fichiers (voir le paragraphe
      Développement des noms de fichiers plus bas).
      Quand une correspondance est trouvée, la liste
      associée est exécutée. Dès qu'un motif correct a
      été trouvé, il n'y a plus d'autre essais de corre­
      spondance. Le code de retour est zéro si aucun
      motif ne correspond, sinon il s'agit du code de la
      liste exécutée.
  • # " 1"

    Posté par  . Évalué à 2.

    J'ai pas de machine unix pour essayer mais, wc n'ajouterai pas un espace près du 1 ?
  • # chezmoiçamarche.com

    Posté par  . Évalué à 1.

    Le script suivant fonctionne chez moi sans le moindre soucis :

    #!/bin/bash
    Erreur=$(cat /tmp/erreur | wc -l)
    case $Erreur in
    1)
    echo La sauvegarde de SERVER effectuée ;;
    *)
    cat /home/erreur >> /var/log/save.log
    echo Problème de sauvegarde sur SERVER | less ;;
    esac


    Si je fais :
    $ echo Coucou > /tmp/erreur && ./test
    J'obtiens :
    La sauvegarde de SERVER effectuée

    Et si je fais :
    $ > /tmp/erreur && ./test
    J'obtiens :
    Problme de sauvegarde sur SERVER
    (END)
    • [^] # Re: chezmoiçamarche.com

      Posté par  . Évalué à 1.

      Je comprend pas...(pourquoi ça marche pas chez moi). : (
      • [^] # Re: chezmoiçamarche.com

        Posté par  . Évalué à 1.

        peut-être parce que tu n'as pas la première ligne ?

        #!/bin/bash
        • [^] # Re: chezmoiçamarche.com

          Posté par  . Évalué à 1.

          Si si, et j'ai même des autrement plus compliqué avec des "case" et des 1 variable qui renvoie un nombre, et eux fonctionne très bien.
          • [^] # Re: chezmoiçamarche.com

            Posté par  . Évalué à 1.

            Essaie d'exécuter ton script avec bash -vx. Tu verras ainsi ce qui se passe lorsqu'il s'exécute.

            Tu as peut-être oublié un ;; quelque part ou un esac (ce ne serait pas du case imbriqué?)
            • [^] # Re: chezmoiçamarche.com

              Posté par  . Évalué à 1.

              Ca y est enfin...
              Alors je ne sais pourquoi mais $Erreur contient des espaces et ce termine par '1' . Pourquoi ????

              Si quelqu' un a une soluce pour supprimer les espaces.....

              Enfin merci pour votre aide à tous.
              • [^] # Re: chezmoiçamarche.com

                Posté par  . Évalué à 2.

                « Si quelqu' un a une soluce pour supprimer les espaces..... »

                Erreur=$(wc -l /home/erreur | sed -e 's/ //g')
                ou
                Erreur=$(wc -l /home/erreur | tr -d ' ')
                ou encore mieux en utilisant les classes de caractères, pour englober aussi les tab
                Erreur=$(wc -l /home/erreur | tr -d '[:space:]')
                • [^] # Re: chezmoiçamarche.com

                  Posté par  . Évalué à 1.

                  Ok
                  Je te remerci,
                  Erreur=$(wc -l /home/erreur | sed -e 's/ //g')
                  marche très bien, par contre les 2 autres lignes génèrent des erreurs.

                  Merci pour votre aide :)

                  PS:je comprend pas d'ou viennent les espaces, surtout que:
                  echo $Erreur
                  ne les affichait pas.:(
                  • [^] # Re: chezmoiçamarche.com

                    Posté par  . Évalué à 1.

                    En fait les espaces avant le 1 sont "normal" pour la commande wc, je pense que ça vient de la mise en forme lorsque tu fait un wc sans l'option -l.
                    Tu aurais vue les espaces si tu avais tapé :
                    echo "$Erreur"
                    Il y avait plus simple que un sed :
                    typeset -i Erreur=$(wc -l /home/erreur)
                    le -i forçant le type integer et donc plus de problème :)
                    • [^] # Re: chezmoiçamarche.com

                      Posté par  . Évalué à 1.

                      et non echo "$ERREUR" donnait
                      1

                      merci pour
                      typeset -i Erreur=$(wc -l /home/erreur)
                • [^] # Re: chezmoiçamarche.com

                  Posté par  . Évalué à 1.

                  Euh juste pour dire qu'avec cat ça fonctionne : ).

                  Erreur=$(cat /home/erreur | wc -l | tr -d ' ')

                  Erreur=$(cat /home/erreur | wc -l | tr -d '[:space:]')

                  Ciao

Suivre le flux des commentaires

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