Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2011, 14h09   #1
Invité régulier
 
Homme
Etudiant
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Etudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 7
Points : 7
Par défaut Petit souci dans un petit script Shell

Bonjour,

Veuillez m'excusez pour le dérangement.
C'est la première fois que je crée un script avec ce langage, et il ne fonctionne pas mais j'ai beau chercher, chercher et encore chercher pas moyen de trouver une solution. Je compte donc sur vous pour m'éclairer si possible.

L'objectif : utilisateur rentre un nombre indéfini de notes et il faut faire la moyenne (et mettre l'appréciation).
Si l'utilisateur a terminé de rentrer ces notes, il doit entrer "entree".
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
 
#initialisation des variables 
note=0
moyenne=0
i=0
rep="non"
 
#Boucle pour la saisie de notes
while [[ $rep != "entree" ]]
do
  echo "Entrez votre note :"
  echo "(Si vous n'avez plus de note à saisir, tapez  : entree)"
  read note
  read rep
 
#Moyenne 
    if (( $note -ge 0 ))#si la note est sup ou égal a 0
    then
        let moyenne=$moyenne+$note
        let i=$i+1#compteur pour connaître le nombre de notes
 
#Annonce moyenne
let moyenne=$moyenne/$i
echo "La moyenne est de $moyenne"
 
#Appréciation
    if (( $moyenne -gt 13 ))#strictement supérieur
    then
        echo "Appréciation : très bien"
    if (( $moyenne -lt 10 ))#strictement inférieur
    then
        echo "Appréciation : passable"
    if (( $moyenne -le 11 ))#inférieur ou égal
    then
        echo "Appréciation : Moyen"
    if (( $moyenne -ge 12 ))#supérieur ou égal
    then
        echo "Appréciation : Bien"
    fi
done

Je me suis aidé des exercice sur ce forum mais il y a toujours cette erreur " syntax error: unexpected end of file ".
Merci d'avance
Khlomn est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/11/2011, 14h23   #2
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 994
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 994
Points : 6 158
Points : 6 158
Bonjour.

Pour commencer le calcul de la moyenne et l'appréciation doivent se faire en dehors de la boucle de saisie.

Ensuite, tu trouvera des exercices corrigés et similaires ici. Par exemple, t'en as un qui saisie des notes jusqu'à ce que l'utilisateur rentre une note négative ...

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 14h26   #3
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Alors,

déjà pour tous tes if, il faut les terminer avec un fi.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


    if (( $moyenne -gt 13 ))#strictement supérieur
    then
        echo "Appréciation : très bien"
    fi 
    if (( $moyenne -lt 10 ))#strictement inférieur
    then
        echo "Appréciation : passable"
    fi
    if (( $moyenne -le 11 ))#inférieur ou égal
    then
        echo "Appréciation : Moyen"
    fi
    if (( $moyenne -ge 12 ))#supérieur ou égal
    then
        echo "Appréciation : Bien"
    fi
Code :
1
2
 
if (( $note -ge 0 ))
test de condition doit être entre crochets if [ condition ] ; then .... fi
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 14h28   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 546
Points : 7 546
A première vue, il manque un nombre certain de fi pour terminer les if, ou alors il faudrait utiliser elif à certains endroits.

Rappel de la syntaxe :
Code :
1
2
3
4
5
6
7
8
9
if <condition1>
then
  <traitement1>
[ elif <condition2>
  then
    <traitement2> ]
[ else
    <traitement3 ]
fi
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 15h37   #5
Invité régulier
 
Homme
Etudiant
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Etudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 7
Points : 7
Merci pour vos réponses rapides !
Je vais essayer de mettre en pratique tous vos conseils.

EDIT : j'ai modifié certaines choses suite à vos indications. Je me demande juste s'il faut mettre deux crochets ouverts pour la condition de la boucle While, car que j'en mette 1 ou 2 mon code n'est pas correct.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash
#initialisation des variables 
note=0
moyenne=0
i=0
rep="oui"
#Boucle pour la saisie de notes
while [[ $rep != "non" ]]
do
  echo "Entrez votre note :"
  read note
#Moyenne 
    if [ $note -ge 0 ]#si la note est sup ou égal a 0
    then
        let moyenne=$moyenne+$note
        let i=$i+1#compteur pour connaître le nombre de notes
    fi
  echo "Il y a-t-il encore une note ?"
  read rep
done
#Annonce moyenne
let moyenne=$moyenne/$i
echo "La moyenne est de $moyenne"
#Appréciation
    if [ $moyenne -gt 13 ]#strictement supérieur
    then
        echo "Appréciation : très bien"
    fi
    if [ $moyenne -lt 10 ]#strictement inférieur
    then
        echo "Appréciation : passable"
    fi
    if [ $moyenne -le 11 ]#inférieur ou égal
    then
        echo "Appréciation : Moyen"
    fi
    if [ $moyenne -ge 12 ]#supérieur ou égal
    then
        echo "Appréciation : Bien"
    fi
En tout cas merci.
Khlomn est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 18h46   #6
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 37
Points : 19
Points : 19
Salut ton problème vient du fait que tu "colles" tes commentaires à la ligne de commande, par conséquent le shell va interpéter le commentaire comme la suite de la commande :

Code :
1
2
 
if [ $note -ge 0 ]#si la note est sup ou égal a 0
Ce qui l'aurait fallu faire c'est juste de mettre un espace :

Code :
1
2
 
if [ $note -ge 0 ]  #si la note est sup ou égal a 0
Ca marchera mieux comme ça

Pour le double crochet, c'est juste une amélioration de la commande "test", ça permet de s'affranchir des guillements pour les valeurs à évaluer.

Tu peux faire soit :

Code :
1
2
 
while [[ $rep != non ]]
soit

Code :
1
2
 
while [ "$rep" != "non" ]
Voilà, reste plus qu'à optimiser ton code, par exemple traiter le cas où la réponse serait autre que "oui".
sedawk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 20h09   #7
Invité régulier
 
Homme
Etudiant
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Etudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 7
Points : 7
J'ai encore une erreur sur le dernier "fi".

Mais au moins grâce à vous, je vois le bout du tunnel merci !
Khlomn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 22h07   #8
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Petite remarque, à la place de :
Code :
1
2
let moyenne=$moyenne+$note
let i=$i+1
Plus simple :
Code :
1
2
moyenne+=$note
((i++))
__________________
Carpe Diem
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h47.


 
 
 
 
Partenaires

Hébergement Web