Problème case esac

Résolu
Bonjour,

J'ai un problème avec ce code :

add() {
if [ "$#" = "5" ] ; then
 case "$1" in
  [1-6]) site="$1";;


*) if [ "$(grep -c $1 fichier.txt)" = "1" ] ; then
   site="$(grep -n $1 fichier.txt)"
  fi
 esac
fi
}


Lorsque je le copie dans mon terminal, voici ce qu'il affiche :

iMac-de-Antoine:~ Antoine$ add() {
> if [ "$#" = "5" ] ; then
> case "$1" in
>
.CFUserTextEncoding .Trash/ .bash_history .config/ .matlab/ .subversion/ Desktop/ Downloads/ Library/ Music/ Public/ campagne.txt
.DS_Store .Xauthority .cache/ .dropbox/ .rnd .wine/ Documents/ Dropbox/ Movies/ Pictures/ VirtualBox VMs/ fichier.txt
> [1-6]) site="$1";;
>
.CFUserTextEncoding .Trash/ .bash_history .config/ .matlab/ .subversion/ Desktop/ Downloads/ Library/ Music/ Public/ campagne.txt
.DS_Store .Xauthority .cache/ .dropbox/ .rnd .wine/ Documents/ Dropbox/ Movies/ Pictures/ VirtualBox VMs/ fichier.txt
> *) if [ "$(grep -c $1 fichier.txt)" = "1" ] ; then
>
.CFUserTextEncoding .Trash/ .bash_history .config/ .matlab/ .subversion/ Desktop/ Downloads/ Library/ Music/ Public/ campagne.txt
.DS_Store .Xauthority .cache/ .dropbox/ .rnd .wine/ Documents/ Dropbox/ Movies/ Pictures/ VirtualBox VMs/ fichier.txt
>
.CFUserTextEncoding .Trash/ .bash_history .config/ .matlab/ .subversion/ Desktop/ Downloads/ Library/ Music/ Public/ campagne.txt
.DS_Store .Xauthority .cache/ .dropbox/ .rnd .wine/ Documents/ Dropbox/ Movies/ Pictures/ VirtualBox VMs/ fichier.txt
> site="$(grep -n $1 fichier.txt)"
>
.CFUserTextEncoding .Trash/ .bash_history .config/ .matlab/ .subversion/ Desktop/ Downloads/ Library/ Music/ Public/ campagne.txt
.DS_Store .Xauthority .cache/ .dropbox/ .rnd .wine/ Documents/ Dropbox/ Movies/ Pictures/ VirtualBox VMs/ fichier.txt
> fi
> esac
> fi
> }


Je n'arrive pas à trouver le problème. Pourquoi n'accepte-t-il pas ma fonction ?

D'avance merci.

6 réponses

  1. J'avais déjà essayé comme ceci, mais même avec ces modifications, le problème subsiste... J'obtiens exactement la même réponse.
    1. Modérateur
      Quel est le but de la fonction ?
      Car là ce que tu as écrit c'est :
      - si ma fonction reçoit 5 arguments
      - si le premier argument vaut un entier entre 1 et 6, alors site prend la valeur du premier argument
      - sinon on cherche si le premier argument est dans fichier.txt, et si on le trouve exactement une fois, alors on reporte le numéro de ligne et la ligne correspondante.

      Vu d'ici ça paraît bizarre :-)
      1. Oui, c'est exactement le but recherché. La fonction n'est pas terminée, ce n'est qu'un début. Il s'agit pour l'instant de renvoyer le numéro d'une ligne d'un fichier soit en inscrivant directement en premier argument le numéro de la ligne, soit en identifiant la ligne par un mot ou une expression contenue dans cette ligne. Les quatre arguments suivant serviront à autre chose. Mais j'aurais aimé tester cette partie de la fonction pour le moment.
        1. Modérateur
          Bon j'ai l'impression que ça fait ce que tu veux alors :

          Script toto.sh

          #!/bin/bash
          
          add() {
          if [ "$#" = "5" ] ; then
              case "$1" in
                  [1-6])
                      site="$1"
                  ;;
                  *)
                      if [ "$(grep -c $1 fichier.txt)" -eq 1 ] ; then
                          site="$(grep -n $1 fichier.txt)"
                      fi
                  ;;
              esac
          fi
          
          }
          
          # Premier appel
          add comment b c d e
          echo "site = $site"
          
          # Deuxieme appel
          add 1 b c d e
          echo "site = $site"
          
          exit 0


          Ici je fais deux appels à la fonction. Le premier appel passe dans le 2e cas, le second appel passe dans le 1er cas.

          fichier.txt :

          Pour tester, j'ai utiliser le fichier suivant :

          www.google.fr
          www.commentcamarche.net
          www.yahoo.fr


          Exécution

          On oublie pas de mettre les droits en lecture et en exécution sur toto.sh, sinon il faut l'exécuter avec la commande
          bash toto.sh
          (et il faut alors seulement les droits en lecture).

          chmod a+rx toto.sh
          ./toto.sh


          Résultat

          Le résultat est conforme a ce que je t'ai annoncé dans mon précédent message.

          site = 2:www.commentcamarche.net
          site = 1


          Bonne chance
          1. Merci beaucoup pour ta réponse ! Mais je viens tout juste de régler mon problème, sans pour autant le comprendre... En fait, lorsque je colle mon code dans la console, il faut que je supprime toutes les tabulations. Résultat : mon code n'est plus indenté, mais il fonctionne. :)

            En tout cas, merci pour ton aide.
            1. Modérateur
              De toute façon je pense que tu as meilleur temps de coder directement dans un fichier, car sinon la seule trace de ton travail sera ton historique... :-)

              Bonne continuation