Problème case esac

Résolu/Fermé
Antoine_Mookoo - Modifié par jipicy le 24/05/2015 à 18:24
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 26 mai 2015 à 09:37
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

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
25 mai 2015 à 19:00
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
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
24 mai 2015 à 20:15
Ce n'est pas tout simplement qu'il manque les
;;
qui font office de break à la fin de chaque cas ?
https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_03.html

Par ailleurs pour les tests sur des valeurs numériques j'aurais plutôt utilisé
-eq
.
https://stackoverflow.com/questions/13086109/check-if-bash-variable-equals-0

Bonne chance
0
Antoine_Mookoo
24 mai 2015 à 20:58
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.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
24 mai 2015 à 22:55
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 :-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Antoine_Mookoo
24 mai 2015 à 23:02
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.
0
Antoine_Mookoo
25 mai 2015 à 19:08
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.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 mai 2015 à 09:37
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
0