Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/10/2013, à 19:16

Dany007

Problème avec structure de contrôle SELECT

Bonjour

J'ai une question concernant le résultat de la structure de contrôle SELECT dans un script.
Voici mon l'énoncé du script:Écrire un script pour permettre à un utilisateur d’exécuter les 3 programmes que l’on vient d’écrire en y accédant par un menu. On pourra utiliser la structure SELECT.
Mon script est donc le suivant:

select choix in "exo1" "exo1test" "exo2"

do
    case $REPLY in
        1)./exo1 ;;
        2)./ex01test ;;
        3)./exo2 ;;
        *) echo "Mauvais choix" ;;
done

==> Ce script fonctionne et c'est donc le résultat qui mon pose souci. C'est-à-dire que grâce au menu, il fait appel à trois autres scripts qui se trouvent dans le même répertoire. Cependant, lorsque je lance le résultat, voici ce que j'obtiens:

~./exo4
1)exo1
2)exo1test
3)exo2
#? 1
Entrez votre note:
16
Très bien
#? 2
Vous devez rentrer 5 paramètres
#? 1 2 3 4 5
Mauvais choix
#? 3
Langue incorrecte

==> C'est-à-dire que, seul le script de l'option 1 fonctionne. Les script des options 2 et 3 ne fonctionnent pas.

Note importante : la fonction "read note" est uniquement présente dans le 1er script (exo1).

====================================
Voici le détail des 3 scripts:

SCRIPT EXO1
exo1: Créer un script qui demande à l'utilisateur de saisir une note et qui affiche un message en fonction de cette note :
"Très bien" si la note est entre 16 et 20 ; "Bien" lorsqu'elle est entre 14 et 16 ;"Assez bien" si la note est entre 12 et 14 ; "Moyen" si la note est entre 10 et 12 et "Insuffisant" si la note est inférieur à 10.

#!/bin/bash

echo "Entrez votre note:"
read note

if [ $note -ge 16 ] ; then
       
        echo "Très bien"

    elif [ $note -ge 14 ] ; then
   
        echo "Bien"

    elif [ $note -ge 12 ] ; then
   
        echo "Assez bien"

    elif [ $note -ge 10 ] ; then
   
        echo "Moyen"
else
        echo "Insuffisant"
fi

====================================
SCRIPT EXO1TEST
exo1test: Créer un script qui affiche la somme de ses 5 paramètres après vérification qu’il y a bien 5 paramètres de saisie. Dans le cas contraire, afficher un message d’erreur.

#!/bin/bash

if [ $# -ne 5 ] ;
then   
    echo "Vous devez rentrer 5 paramètres"

else
   
    i=`expr $1 + $2 + $3 + $4 + $5`
    echo $
if

========================================
SCRIPT EXO2
exo2: Créer 1 script qui teste en paramètre 2 types de langues (F et A) et dit bonjour dans cette langue (utiliser CASE).

#!/bin/bash

case $1 in

    Francais) echo " Bonjour " ;;   
    Anglais) echo " Morning " ;;
    Italien) echo " Ciao " ;;
    *) echo " Langue incorrecte "

esac

============================================

D'avance, merci de votre aide.

Dany

Hors ligne

#2 Le 16/10/2013, à 19:45

pingouinux

Re : Problème avec structure de contrôle SELECT

Re-bonjour,

Voici les anomalies que j'ai remarquées. Je pense que tu aurais pu en trouver certaines en testant les scripts un à un, et en analysant les messages d'erreur.

Dans exo4 :
1- Il manque un esac pour terminer le case
2- ex01test est différent de exo1test
3- exo2 est appelé sans argument, alors que ce script attend une langue

Dans exo2 :
1- Il manque ;; à la fin du cas par défaut
2- Il faudrait lire la langue choisie dans le script

Dans exo1test :
1- C'est echo $i, et non echo $
2- Tu termines le if par if au lieu de fi
3- Il faut lire les paramètres dans le script
4- i=`expr $1 + $2 + $3 + $4 + $5` peut être remplacé par i=$(($1 + $2 + $3 + $4 + $5))

Édité : Quelques précisions ajoutées

Dernière modification par pingouinux (Le 16/10/2013, à 19:52)

Hors ligne

#3 Le 16/10/2013, à 20:30

Dany007

Re : Problème avec structure de contrôle SELECT

Merci beaucoup. Je viens de travailler sur tes précisions et voici mes conclusions:

I - Pourrais-tu m'apporter quelques précisions sur:

Dans exo2 :
2- Il faudrait lire la langue choisie dans le script
==> Je ne comprends pas bien ce que tu veux dire par "lire la langue choisie dans le script"

Dans exo1test :
3- Il faut lire les paramètres dans le script
==> Je ne comprends pas bien ce que tu veux dire par "lire les paramètres dans le script"


II - En ce qui concerne ces fautes :

Dans exo4 :
1- Il manque un esac pour terminer le case
2- ex01test est différent de exo1test

Dans exo2 :
1- Il manque ;; à la fin du cas par défaut

Dans exo1test :
1- C'est echo $i, et non echo $
2- Tu termines le if par if au lieu de fi

Ce sont des fautes d'inattention car je recopie 'à la main' des scripts sur ce forum. Je fais les tests LINUX sur VM et, comme je n'arrive pas copier/coller sur mon OS Windows 7, je recopie... Désolé.

Hors ligne

#4 Le 16/10/2013, à 20:48

pingouinux

Re : Problème avec structure de contrôle SELECT

Dans exo4, tu ne sais pas quel script tu vas appeler, ni par conséquent les paramètres éventuels que tu auras à fournir. Il me paraît logique de lire ces paramètres dans les scripts appelés, comme tu le fais pour note dans exo1.

Tu peux par exemple ajouter ceci au début de exo1test :

read -p "Donnez 5 valeurs entières : " p1 p2 p3 p4 p5

Il faut vérifier ensuite que les 5 valeurs sont bien définies.

De même, dans exo2 :

read -p "Langue choisie : " langue

Hors ligne

#5 Le 16/10/2013, à 20:54

Dany007

Re : Problème avec structure de contrôle SELECT

Oui, c'est bien cela.
READ n'apparait pas dans les deux scripts (contrairement à EXO1) et c'est pour cela que ça doit pêcher.
Je fais un test de suite

Hors ligne

#6 Le 17/10/2013, à 06:37

pingouinux

Re : Problème avec structure de contrôle SELECT

Voici des suggestions pour exo1test :

#!/bin/bash

read -p "Donnez 5 valeurs entières : " param
set -- $param

if [ $# -ne 5 ] ;
then
    echo "Vous devez rentrer 5 paramètres"
else
    i=$(($1 + $2 + $3 + $4 + $5))
#  Ou bien ceci, qui est valable quel que soit le nombre de paramètres
#  i=$(( $(sed 's/ \+/+/g' <<<"$@") ))
    echo $i
fi

ou bien

#!/bin/bash

read -p "Donnez 5 valeurs entières : " param
tablo=( $param )

if [ ${#tablo[@]} -ne 5 ] ;
then
    echo "Vous devez rentrer 5 paramètres"
else
    i=$(( $(sed 's/ \+/+/g' <<<"${tablo[@]}") ))
    echo $i
fi

Édité : Ajout d'un commentaire

Dernière modification par pingouinux (Le 17/10/2013, à 06:46)

Hors ligne

#7 Le 17/10/2013, à 07:16

Dany007

Re : Problème avec structure de contrôle SELECT

Hello
Merci beaucoup pour le message.
Si tu me le permets, je réaliserai cette opération ne fin de journée et clôturerais également le dossier.
A plus tard et bonne journée smile
Dany

Hors ligne

#8 Le 17/10/2013, à 07:17

Watael

Re : Problème avec structure de contrôle SELECT

salut,

#!/bin/bash

read -a -p "Donnez 5 valeurs entières : " tablo
(( ${#tablo[@]} == 5 ? i=$(IFS='+'; echo "${tablo[*]}") : 0 )) && echo $i || echo error

XD


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 17/10/2013, à 07:18

Dany007

Re : Problème avec structure de contrôle SELECT

cool cool cool
A ce soir!

Hors ligne

#10 Le 17/10/2013, à 07:34

pingouinux

Re : Problème avec structure de contrôle SELECT

@Watael #8 : Merci pour cette simplification

Hors ligne

#11 Le 21/10/2013, à 15:31

Postmortem

Re : Problème avec structure de contrôle SELECT

Salut,

Watael a écrit :

salut,

#!/bin/bash

read -a -p "Donnez 5 valeurs entières : " tablo
(( ${#tablo[@]} == 5 ? i=$(IFS='+'; echo "${tablo[*]}") : 0 )) && echo $i || echo error

XD


Si la somme des 5 entiers est égale à 0, ça va afficher error.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne