Rechercher : dans
Par :

[Bash] Probleme variables

Dernière réponse le 15 jun 2009 à 20:37:05 H4RDW4RE, le 15 jun 2009 à 13:03:25 
 Signaler ce message aux modérateurs

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

A PC is like a plane, when you open Windows, it's the crash !!!

1/= |_| [4/V |^34[) 7#15, |_|'|^3 4/V 3><7|^3(v)3 633|< !!!
Configuration: Linux Ubuntu-eee 8.04.2

Meilleures réponses pour « [Bash] Probleme variables » dans :
Le remplacement de variables en shell Bash Voir =Le remplacement de variables= Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...
[Bash] La variable d'environnement PATH VoirLa variable d'environnement PATH I. Préambule II. C'est quoi le shell ? III. Définition IV. Séance de dissection V. Ajouter un répertoire à la variable PATH VI. Et puis... I. Préambule Sous les systèmes GNU/Linux qu'on le veuille ou...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Comment récupérer le résultat d'une commande dans une variable VoirComment récupérer le résultat d'une commande dans une variable Préambule Syntaxe Exemples Préambule Il est bien souvent nécessaire de récupérer le résultat d'une commande (ou de son code retour) dans une variable afin de pouvoir...
Javascript - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. En Javascript, les noms de variables peuvent être aussi long que l'on désire,...
Variables d'environnement VoirVariables d'environnement Une variable d'environnement est une valeur dynamique, chargée en mémoire, pouvant être utilisée par plusieurs processus fonctionnant simultanément. Sur la plupart des systèmes d'exploitation, les emplacement de...
PHP - Les variables d'environnement VoirNotion de variable d'environnement Les variables d'environnement sont, comme leur nom l'indique, des données stockées dans des variables permettant au programme d'avoir des informations sur son environnement. L'environnement, dans le cas du script...

1

Yun, le 15 jun 2009 à 15:07:13

Hello!

Pourquoi avoir mis des ";" à la fin de tes conditions?

Répondre à Yun

2

H4RDW4RE, le 15 jun 2009 à 15:53:55

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... A PC is like a plane, when you open Windows, it's the crash !!!

1/= |_| [4/V |^34[) 7#15, |_|'|^3 4/V 3><7|^3(v)3 633|< !!!

Répondre à H4RDW4RE

3

jipicy, le 15 jun 2009 à 20:14:16

Salut,

Il manque un espace après le crochet ouvrant de tous les "elif" :

elif [$REQUEST1 = "p" ]; then <= BAD
elif [ $REQUEST1 = "p" ]; then <= RIGHT
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

4

 H4RDW4RE, le 15 jun 2009 à 20:37:05

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 A PC is like a plane, when you open Windows, it's the crash ­!!!

1/= |_| [4/V |^34[) 7#15, |_|'|^3 4/V 3><7|^3(v)3 633|< !!!

Répondre à H4RDW4RE
Collection CommentÇaMarche.net