Pages : 1
#1 Le 08/05/2008, à 21:02
- The_true_power
Condition zenity
Salut, j'aimerais faire une condition.
donc avec zenity je fais :
memo() {
title="Temps Primitifs"
text="Choisissez un verbe"
reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
while true ; do
memo
if [ "$?" != 0 ] ; then
exit
fi
if [ "$reponse" = "Accipere" ] ;
then Accipere=$(zenity --entry --text "Donnez moi le TH² de Accipere"); echo $Accipere
if $accipere=accepi
then zenity --info --text "Bien joué !"
fi
fi
done
Mon but est donc que une fois "Accipere" selectionné dans la liste, il me demande le TH² de Accipere (c'est du latin pour ceux qui voudraient savoir ) et que si la valeur entrée = accepi, il me dise "bien joué!"
Seulement je ne sais pas comment faire... je ne vais pas plus loin que la fenêtre où il me demande d'entrer la valeur.
Merci
PS : si quelqu'un pouvait me donner un script zenity utilisant plein de fonctions plus profondes que dans le man, ce serait cool
Dernière modification par The_true_power (Le 08/05/2008, à 21:03)
Hors ligne
#2 Le 09/05/2008, à 02:59
- garnier
Re : Condition zenity
Bonsoir,
ton code avec une petite modification :
#!/bin/bash
memo (){
title="Temps Primitifs"
text="Choisissez un verbe"
reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
while true
do
memo
if [ "$?" != 0 ]
then
exit
fi
if [ "$reponse" = "Accipere" ]
then
accipere=`zenity --entry --text "Donnez moi le TH² de Accipere"`
if [ "${accipere}" = "accepi" ]
then
echo "${accipere}"
zenity --info --text "Bien joué !"
else
echo "${accipere}"
zenity --info --text "Bip ! mauvaise réponse"
fi
fi
done
codialement benoit
#3 Le 09/05/2008, à 18:15
- The_true_power
Re : Condition zenity
merci beaucoup !
Maintenant si j'ai envie que dans la condition
if [ "$reponse" = "Accipere" ]
il me pose une question au hasard... en gros qu''il puisse me demander aussi bien le th1 que le th2 ou la traduction. Et le tout aléatoirement.
Comment puis-je faire ?
Dernière modification par The_true_power (Le 09/05/2008, à 18:15)
Hors ligne
#4 Le 09/05/2008, à 21:03
- garnier
Re : Condition zenity
Bonsoir,
un début de réponse avec la generation d'un nombre aleatoire dans la fourchette [0,2]:
#!/bin/bash
aleatoire=0
conversion=""
memo ()
{
title="Temps Primitifs"
text="Choisissez un verbe"
reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
# ---------------------------------------------------------------
#
# function de conversion MAJUSCULE -> MINUSCULE
#
# ---------------------------------------------------------------
toLower()
{
conversion=`echo $1 | tr '[A-Z]' '[a-z]'`
echo $conversion
}
aleatory()
{
aleas=$((RANDOM%3))
echo $aleas
}
# ---------------------------------------------------------------
#
# fin des fonctions
#
# ---------------------------------------------------------------
while true
do
memo
if [ "$?" != 0 ]
then
exit
fi
case $reponse in
Accipere )
case `aleatory` in
0) #---------------- cas TH² --------------
rep=`zenity --entry --text "Donnez moi le TH² de Accipere"`
if [ "accepi" = `toLower $rep` ]
then
zenity --info --text "TH² Bien joué !"
else
zenity --info --text "Bip ! mauvaise réponse pour TH²"
fi
;;
1) #---------------- cas TH1 --------------
rep=`zenity --entry --text "Donnez moi le TH1 de Accipere"`
if [ "truc" = `toLower $rep` ]
then
zenity --info --text "TH1 Bien joué !"
else
zenity --info --text "Bip ! mauvaise réponse pour TH1"
fi
;;
2) #-------------- Tradution ----------------------
rep=`zenity --entry --text "Donnez moi la traduction de Accipere"`
if [ "traduction" = `toLower $rep` ]
then
zenity --info --text "Traduction Bien joué !"
else
zenity --info --text "Bip ! mauvaise traduction"
fi
;;
esac
;;
Addere )
case `aleatory` in
0) #---------------- cas TH² --------------
rep=`zenity --entry --text "Donnez moi le TH² de Addere"`
if [ "adderi" = `toLower $rep` ]
then
zenity --info --text "TH² Bien joué !"
else
zenity --info --text "Bip ! mauvaise réponse pour TH²"
fi
;;
1) #---------------- cas TH1 --------------
rep=`zenity --entry --text "Donnez moi le TH1 de Addere"`
if [ "truc" = `toLower $rep` ]
then
zenity --info --text "TH1 Bien joué !"
else
zenity --info --text "Bip ! mauvaise réponse pour TH1"
fi
;;
2) #-------------- Tradution ----------------------
rep=`zenity --entry --text "Donnez moi la traduction de Addere"`
if [ "traduction" = `toLower $rep` ]
then
zenity --info --text "Traduction Bien joué !"
else
zenity --info --text "Bip ! mauvaise traduction"
fi
;;
esac
;;
esac
done
je te laisse faire la correction des temps et des traduction, puis à developper pour les autres mots en latin.
Ce script peut être amelioré, par l'ajout de fonction etc ....
cordialement benoit
#5 Le 09/05/2008, à 21:13
- garnier
Re : Condition zenity
Bonsoir,
je viens de me relire, aie !
La fonction qui genere le nombre aléatoire est la fonction aleatory().
Pour la phrase ci-dessous :
je te laisse faire la correction des temps et des traduction, puis à developper pour les autres mots en latin.
il faut comprendre que je te laisse développer le code shell pour la liste des mots ainsi que la correction des bonnes réponses pour Accipere et Addere.
cordialement benoit.
#6 Le 09/05/2008, à 21:50
- garnier
Re : Condition zenity
Bonsoir,
Le script avec une petite amelioration
#!/bin/bash
aleatoire=0
conversion=""
memo ()
{
title="Temps Primitifs"
text="Choisissez un verbe"
reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
# ---------------------------------------------------------------
#
# function de conversion MAJUSCULE -> MINUSCULE
#
# ---------------------------------------------------------------
toLower()
{
conversion=`echo $1 | tr '[A-Z]' '[a-z]'`
echo $conversion
}
# ---------------------------------------------------------------
#
# genere un nombre aleatoire entre 0 et 2
#
# ---------------------------------------------------------------
aleatory()
{
aleas=$((RANDOM%3))
echo $aleas
}
# ---------------------------------------------------------------
#
# good answer
#
# ---------------------------------------------------------------
good()
{
case $1 in
0)
zenity --info --text "TH² Bien joué pour $2 !"
;;
1)
zenity --info --text "TH1 Bien joué pour $2 !"
;;
2)
zenity --info --text "Traduction Bien joué pour $2!"
;;
esac
}
# ---------------------------------------------------------------
#
# bad answer
#
# ---------------------------------------------------------------
bad()
{
case $1 in
0)
zenity --info --text "Bip ! TH2 mauvaise réponse pour $2, attendu $3"
;;
1)
zenity --info --text "Bip ! TH1 mauvaise réponse pour $2, attendu $3"
;;
2)
zenity --info --text "Bip ! mauvaise traduction pour $2, attendu $3"
;;
esac
}
# ---------------------------------------------------------------
#
# fin des fonctions
#
# ---------------------------------------------------------------
while true
do
memo
if [ "$?" != 0 ]
then
exit
fi
case $reponse in
Accipere )
case `aleatory` in
0) #---------------- cas TH² --------------
rep=`zenity --entry --text "Donnez moi le TH² de Accipere"`
if [ "accepi" = `toLower $rep` ]
then
good 0 "Accipere"
else
bad 0 "Accipere" "accepi"
fi
;;
1) #---------------- cas TH1 --------------
rep=`zenity --entry --text "Donnez moi le TH1 de Accipere"`
if [ "truc" = `toLower $rep` ]
then
good 1 "Accipere"
else
bad 1 "Accipere" "truc"
fi
;;
2) #-------------- Tradution ----------------------
rep=`zenity --entry --text "Donnez moi la traduction de Accipere"`
if [ "traduction" = `toLower $rep` ]
then
good 2 "Accipere"
else
bad 2 "Accipere" "traduction"
fi
;;
esac
;;
Addere )
case `aleatory` in
0) #---------------- cas TH² --------------
rep=`zenity --entry --text "Donnez moi le TH² de Addere"`
if [ "adderi" = `toLower $rep` ]
then
good 0 "Addere"
else
bad 0 "Addere" "adderi"
fi
;;
1) #---------------- cas TH1 --------------
rep=`zenity --entry --text "Donnez moi le TH1 de Addere"`
if [ "truc" = `toLower $rep` ]
then
good 1 "Addere"
else
bad 1 "Addere" "truc"
fi
;;
2) #-------------- Tradution ----------------------
rep=`zenity --entry --text "Donnez moi la traduction de Accipere"`
if [ "traduction" = `toLower $rep` ]
then
good 2 "Addere"
else
bad 2 "Addere" "traduction"
fi
;;
esac
;;
esac
done
cordialement benoit
#7 Le 10/05/2008, à 09:03
- The_true_power
Re : Condition zenity
Encore merci
Mais je suis confronté à un autre problème :
Lorcequ'une traduction fait plusieurs mots comme par exemple "prendre garde".
Ca donne :
2) #-------------- Tradution ----------------------
rep=`zenity --entry --text "Donnez moi la traduction de Cavere"`
if [ "prendre garde'" = `toLower $rep` ]
Mais j'ai beau donner prender garde, il me dit toujours que c'est faux.
Comment résoudre ce problème ?
S'il te plaît ne modifie par le script mais explique moi simplement comment
Encore merci
Hors ligne
#8 Le 10/05/2008, à 21:38
- garnier
Re : Condition zenity
Bonsoir,
La raison de ce comportement est toute bête, à l'origine c'est une simple omission:
dans le test "if [ "......" = `........` ]" la valeur de droite du signe égal, (ici ` ` connu sous l'intitulé "remplacement de commandes" ) retourne sur la sortie standard, après son évalutation, son résultat en remplacement du texte de la commande.
A savoir l'expression entre `....` après évaluation, est remplacée par l'execution de la commande echo $conversion.
exemple :
avec rep="ACCEPI"
if [ "accepi" = `toLower $rep` ] donne après évaluation du "remplacement de commandes" if [ "accepi" = accepi ].
L'incident dans notre cas est le suivant :
avec rep="prendre garde"
if [ "prendre garde" = `toLower $rep` ] donne if [ "prendre garde" = prendre garde ].
La comparaison ( condition du if ) est évaluée sur le mot 'prendre' et non sur la chaîne de caractères "prendre garde", d'où l'affichage par zenity d'une erreur de traduction.
De plus le bash retourne, si tu le lance avec l'option -x un message du type :
<nom du script>: line <numero de ligne correpondant au if>: [: trop d'arguments.
Le mot 'garde ' est considéré comme un argument supplémentaire en dehors de la comparaison.
La solution :
mettre entre des guillemets ("") le remplacement de commandes afin que l'évaluation porte sur la chaîne de caractères en entier.
soit :
if [ "prendre garde" = `toLower $rep` ] à remplacer par if [ "prendre garde" = "`toLower $rep`" ]
cordialement benoit
#9 Le 11/05/2008, à 14:47
- The_true_power
Re : Condition zenity
Encore merci Garnier, mais lorsque je fais cette modification, il n'y a aucun changement. J'ai fais l'exacte modification que tu m'as décrite mais rien n'y fait...
Hors ligne
#10 Le 11/05/2008, à 17:01
- garnier
Re : Condition zenity
Salut,
, voici ce qu'il faut faire :
remplacer les if [ "......" = "`toLower $rep`" ] par if [ "....." = "`toLower "$rep"`" ]
cordialement Benoit
#11 Le 11/05/2008, à 19:17
- The_true_power
Re : Condition zenity
Merci beaucoup garnier !
edit : bon le script marche (on va dire la 1.0 ) mais j'aimerai l'améliorer.
J'aimerai savoir comment on fait une variable numérique (qui contient un nombre donc) et comment la manipuler (augmenter la variable Y de X, la diviser par Z, ... ) merci
Dernière modification par The_true_power (Le 11/05/2008, à 19:57)
Hors ligne
#12 Le 12/05/2008, à 03:23
- garnier
Re : Condition zenity
Merci beaucoup garnier !
edit : bon le script marche (on va dire la 1.0 ) mais j'aimerai l'améliorer.
J'aimerai savoir comment on fait une variable numérique (qui contient un nombre donc) et comment la manipuler (augmenter la variable Y de X, la diviser par Z, ... ) merci
Les variables Bash et sh ne sont pas typées.
La syntaxe n'est pas la même si tu utilise le shell "/bin/sh" ou le shell "/bin/bash" :
/bin/sh ( à lancer par sh <nom du script> ):
#!/bin/sh
var1=2
var2=10
# Addition
nombre=`expr $var1 + $var2`
echo "$var1 + $var2 = $nombre"
# ou
nbr=$( expr $var1 + $var2 )
echo "$var1 + $var2 = $nbr"
# Soustraction
nombre=`expr $var2 - $var1`
echo "$var2 - $var1 = $nombre"
# ou
nbr=$( expr $var2 - $var1 )
echo "$var2 - $var1 = $nbr"
# Multiplication
nombre=`expr $var2 '*' $var1` # Attention à mettre entre quote le signe *
echo "$var2 * $var1 = $nombre"
# ou
nbr=$( expr $var2 '*' $var1 )
echo "$var2 * $var1 = $nbr"
# Division entiere
nombre=`expr $var2 / $var1` # ne donne jamais le reste de la division
echo "$var2 / $var1 = $nombre"
# ou
nbr=$( expr $var2 / $var1 )
echo "$var2 / $var1 = $nbr"
# Modulo ou reste de la division
nombre=`expr $var2 % $var1`
echo "$var2 % $var1 = $nombre"
# ou
nbr=$( expr $var2 % $var1 )
echo "$var2 % $var1 = $nbr"
# Incrementation
nombre=0
nombre=`expr $nombre + 1` # Incrementation avec un pas de 1
echo "Incrementation de nombre = $nombre"
# ou
nbr=0
nbr=$( expr $nbr + 1 )
echo "Incrementation de nbr = $nbr"
# Decrementation
nombre=`expr $nombre - 1`
echo "Decrementation de nombre = $nombre"
# ou
nbr=$( expr $nbr - 1 )
echo "Decrementation de nbr = $nbr"
NB: il est impératif de laisser un caractère <espace> autour des opérateurs + - / * %
/bin/bash :
#!/bin/bash
# ----------------------
let var1=2
let var2=10
# -----------------------------------------------------
# Les syntaxes possibles sont :
# -----------------------------------------------------
# let "nombre=$var1 <operateur> $var2"
# let nombre="$var1 <operateur> $var2"
# let "nombre=$var1<operateur>$var2"
# let nombre=$var1<operateur>$var2
# -----------------------------------------------------
# Addition
let nombre="$var1+$var2"
echo "$var1 + $var2 = $nombre"
# Soustraction
let nombre="$var2-$var1"
echo "$var2 - $var1 = $nombre"
# Multiplication
let nombre="$var1*$var2"
echo "$var1 * $var2 = $nombre"
# Division entiere
let nombre="$var2/$var1"
echo "$var2 / $var1 = $nombre"
# Modulo ou reste de la division entiere
let nombre="$var2%$var1"
echo "$var2 % $var1 = $nombre"
# Operateur etendu +=
# Syntaxe equivalente à : let var2="$var2 + $var1"
let "var2 += $var1"
echo "10 += $var1 = $var2"
# Operateur etendu -=
# Syntaxe equivalente à : let var2="$var2 - $var1"
let "var2 -= $var1"
echo "12 -= $var1 = $var2"
# Operateur etendu /=
# Syntaxe equivalente à : let var2="$var2 / $var1"
let "var2 /= $var1"
echo "10 /= $var1 = $var2"
# Operateur etendu %=
# Syntaxe equivalente à : let var2="$var2 % $var1"
let "var2 %= $var1"
echo "5 %= $var1 = $var2"
# Incrementation
# Equivalent à : let var2="$var2 + 1"
let "var2 += 1"
echo "Incrementation de var2 = $var2"
# Decrementation
# equivalent à : let var2="$var2 - 1"
let "var2 -= 1"
echo "Decrementation de = $var2"
Utilisation de declare -i <nom d'un variable> ( equivalent à typeset ) :
syntaxe : <variable>=<operande 1><operateur><operande 2>
#!/bin/bash
declare -i var2=10
declare -i var1=2
declare -i nombre=0
# Addition
nombre=$var1+$var2
echo "$var1 + $var2 = $nombre"
# Soustraction
nombre=$var2-$var1
echo "$var2 - $var1 = $nombre"
# Multiplication
nombre=$var2*$var1
echo "$var2 * $var1 = $nombre"
# Division entiere
nombre=$var2/$var1
echo "$var2 / $var1 = $nombre"
# Modulo ou reste de la division entiere
nombre=$var2%$var1
echo "$var2 % $var1 = $nombre"
# Incrementation
nombre=$nombre+1
echo "Incrementation de nombre = $nombre"
# Decrementation
nombre=$nombre-1
echo "Decrementation de nombre = $nombre"
Voilà .
cordialement Benoit
#13 Le 14/05/2008, à 16:11
- The_true_power
Re : Condition zenity
ok, maintenant grace à toi je sais faire des variables bash et mon script est fini
encore merci
Hors ligne
Pages : 1