[Bash] Probleme variables

Résolu/Fermé
Utilisateur anonyme - 15 juin 2009 à 13:03
 Utilisateur anonyme - 15 juin 2009 à 20:37
Bonjour a tous

Je "programme" 2-3 trucs simples en Bash sous Ubuntu pour m'entrainer, car je débute.
J'ai voulu faire un QCM (inutile, mais juste pour s'entrainer) qui se gère comme ceci :

10 questions
4 suggestions (a,b,c,d) + possibilité de passer la questoin (p)
1 réponses justes : + 2 points
1 réponses fausses : -1 point
Pas de réponses : 0

Le QCM calcul le score, et dit combien il y a eu de réponses justes, de fausses et de passées.
Le scre se calcul bien, les réponses justes et fausses aussi.

Mais les réponses passées ne sont pas comptées comme passées, mais comme fausses...

Je ne trouve pas d'ou vient l'erreur...

Voici le code :

#!/bin/sh

# Je note les questions, suggestions et réponses en variables au début pour qu'on puisse les changers facilement sans parcourir tout le code...

#
# DELCARATION VARIABLES (QUESTIONS, CHOIX, REPONSES...)
#

# QUESTION 1 : 
QUESTION1="En quelle annee le langage C est-il apparu dans les laboratoires Bell ?"
X1="a) 1969    b) 1972    c) 1975    d) 1978    p) Passer la question"
ANSWER1="b"
#QUESTION 2 : 
QUESTION2="Quelle est la frequence du sifflet utilise par John Drapper pour pirater le telephone ?"
X2="a) 2200 Hz    b) 2400 Hz    c) 2600 Hz    d) 2800 Hz    p) Passer la question"
ANSWER2="c"
# QUESTION 3 : 
QUESTION3="Qui a developpe le langage C++ dans les annees 1980 ?"
X3="a) Dennis Ritchie    b) Ken Thompson   c) Rasmus Lerdorf   d)Bjarne Stroustrup    p) Passer la question"
ANSWER3="d"
#QUESTION 4 : 
QUESTION4="Qui est a l'origine de l'implantation du protocol AX.25 dans le kernel Linux ?"
X4="a) Richard Stallman    b) Alan Cox    c) Linus Torvalds    d) Tim Berners-Lee    p) Passer la question"
ANSWER4="b"
#QUESTION 5 :
QUESTION5="Quelle est la valeur de la variable 'x' quelques minutes apres le lancement du programme ?"
# Remarque : le code est dans : "question_5-C_code" que j'affiche grâce à la commmande "cat".
X5="a) 0    b) 1    c) Impossible de savoir sa valeur    d) 1447    p) Passer la question"
ANSWER5="c"
#QUESTION 6 : 
QUESTION6="Sous Linux Ubuntu, quelle commande (shell) permet d'installer lle paquet 'amsn' ?"
X6="a) yum install amsn    b) synaptic install amsn    c) sudo amsn    d) sudo apt-get install amsn    p) Passer la question"
ANSWER6="d"
#QUESTION 7 : 
QUESTION7="Quel commutateur de la commande 'NETSTAT' (commande DOS) ppermet d'afficher les adresses et numeros de ports en format numérique ?"
X7="a) -a    b) -n    c) -b    d) -s    p) Passer la question"
ANSWER7="b"
#QUESTION 8 :
QUESTION8="Que vaut le mot de passe ?"
# Remarque : le code est dans : "question_8-JS_code" que j'affiche grâce à la commmande "cat".
X8="a) 12454578    b) 1447    c) 36    d) 0336    p) Passer la question"
ANSWER8="b"
#QUESTION 9 : 
QUESTION9="Quelle est la valeur de la variable 'result' ?"
# Remarque : le code est dans : "question_9-C_code" que j'affiche grâce à la commmande "cat".
X9="a) 103    b) 1433    c) 0    d) 5    p) Passer la question"
ANSWER9="d"
#QUESTION 10 :
QUESTION10="Qui etait le plus grand rival de l'expert en informatique Tsutomu Shimomura ?"
X10="a) Adrian Lamo    b) Kevin Poulsen    c) Kevin Mitnick    d) Jonathan James    p) Passer la question"
ANSWER10="c"

SCORE=0
TRUE=0
FALSE=0
SKIP=0

#
# DEBUT DU CODE
#

clear
echo
echo "QCM Hacking [Bash Version]"
echo
echo
echo "Une bonne reponse : +2 points"
echo "Une mauvaise reponse : -1 point"
echo "Pas de reponse (passer la question) : 0"
echo "Reponses en majuscules et reponses autres que 'a, b, c, d, p' : faux (-1 point)"
echo
echo
echo
echo "Question 1/10"
echo
echo "$QUESTION1"
echo
echo "$X1"
echo
read -p "Votre choix : " REQUEST1
clear
echo
echo "Question 2/10"
echo
echo "$QUESTION2"
echo
echo "$X2"
echo
read -p "Votre choix : " REQUEST2
clear
echo
echo "Question 3/10"
echo
echo "$QUESTION3"
echo
echo "$X3"
echo
read -p "Votre choix : " REQUEST3
clear
echo
echo "Question 4/10"
echo
echo "$QUESTION4"
echo
echo "$X4"
echo
read -p "Votre choix : " REQUEST4
clear
echo
echo "Question 5/10"
echo
echo "$QUESTION5"
echo
cat "./Question_5-C_code"
echo
echo "$X5"
echo
read -p "Votre choix : " REQUEST5
clear
echo
echo "Question 6/10"
echo
echo "$QUESTION6"
echo
echo "$X6"
echo
read -p "Votre choix : " REQUEST6
clear
echo
echo "Question 7/10"
echo
echo "$QUESTION7"
echo
echo "$X7"
echo
read -p "Votre choix : " REQUEST7
clear
echo
echo "Question 8/10"
echo
echo "$QUESTION5"
echo
cat "./Question_8-JS_code"
echo
echo "$X8"
echo
read -p "Votre choix : " REQUEST8
clear
echo
echo "Question 9/10"
echo
echo "$QUESTION9"
echo
cat "./Question_9-C_code"
echo
echo "$X9"
echo
read -p "Votre choix : " REQUEST9
clear
echo
echo "Question 10/10"
echo
echo "$QUESTION10"
echo
echo "$X10"
echo
read -p "Votre choix : " REQUEST10

#
# CALCULS SCORE ET STATUS DES QUESTIONS (JUSTES, FAUSSES, PASSEES)
#


clear
# QUESTION 1
if [ $REQUEST1 = $ANSWER1 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST1 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 2
if [ $REQUEST2 = $ANSWER2 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST2 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 3
if [ $REQUEST3 = $ANSWER3 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST3 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 4
if [ $REQUEST4 = $ANSWER4 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST4 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 5
if [ $REQUEST5 = $ANSWER5 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST5 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 6
if [ $REQUEST6 = $ANSWER6 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST6 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 7
if [ $REQUEST7 = $ANSWER7 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST7 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 8
if [ $REQUEST8 = $ANSWER8 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST8 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 9
if [ $REQUEST9 = $ANSWER9 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST9 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

# QUESTION 10
if [ $REQUEST10 = $ANSWER10 ]; then
	SCORE=$(($SCORE+2))
	TRUE=$(($TRUE+1))

elif [$REQUEST10 = "p" ]; then
	SKIP=$(($SKIP+1))

else
	SCORE=$(($SCORE-1))
	FALSE=$(($FALSE+1))
fi

#
# AFFICHAGE SCORE ET STATUS QUESTIONS
#

clear
echo
echo "Score : $SCORE / 20"
echo
echo "Reponses justes : $TRUE / 10"
echo "Reponses fausses : $FALSE / 10"
echo "Reponses passees : $SKIP / 10"
echo
echo "Appuyez sur <Entree> pour continuer..."
read KEY
case $KEY in
*)	;;
esac


Je sais que le code est "brouillon", j'ai l'intention de le refaire plus propre, grâce à des fonctions...
Mais j'aimerais déjà savoir pourquoi il ne marche pas comme cela.

Cordialement

H4RDW4RE

4 réponses

Hello!

Pourquoi avoir mis des ";" à la fin de tes conditions?
0
Utilisateur anonyme
15 juin 2009 à 15:53
Ben je sais pas, j'ai toujours fais comme sa... Cest pour delimiter la condition.
J'ai fait des autres Bash avec des ";" à la fin de mes conditions, et ils marchent très bien !
Sans les ";", au momment du calcul, le bash se ferme automatiquement.

J'ai appris selon des tutos qui disent qu'il faut mettre sa condition suivit d'un ";", puis le "then" et mettre les commandes en dessous qui seront exécuté ou non selon la condition...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
15 juin 2009 à 20:14
Salut,

Il manque un espace après le crochet ouvrant de tous les "elif" :
elif [$REQUEST1 = "p" ]; then <= BAD
elif [ $REQUEST1 = "p" ]; then <= RIGHT
;-))
0
Utilisateur anonyme
15 juin 2009 à 20:37
Je suis trop bête...
Je le sais en plus, je l'ai fait correctement aux lignes

if [ $REQUEST1 = $ANSWER1 ]; then


C'était tellement simple, que je n'ai pas vue l'erreur. Et pourtant je les relut le code...
J'ai fait la faute la première fois, et ensuite j'ai fais copier/coller en changeant juste les numéros des variables...

Merci beaucoup Jipicy de m'avoir ouvert les yeux =)

Bye
0