Bruno Javotte
2 years ago
1 changed files with 411 additions and 0 deletions
-
411run.sh
@ -0,0 +1,411 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
|
||||
|
########################## |
||||
|
# Version beta 1 |
||||
|
# Cette version ne fonctionne PAS dans le cas où la réponse à une 'question A CHOIX UNIQUE (de type radio bouton)' contient une 'virgule' |
||||
|
# Il se peut également que la version ne fonctionne pas si la réponse contient des guillemets. |
||||
|
# Les questions A CHOIX MULTIPLES, eux, n'induisent jamais ce genre de problème car les réponses multiples sont de type booleen "Oui"/"Non". |
||||
|
# |
||||
|
# En conséquence, s-assurer que les réponses uniques ne contiennent pas de virgules avant d-utiliser ce code. |
||||
|
########################## |
||||
|
|
||||
|
########################## |
||||
|
# Ressources |
||||
|
# https://learn-bash.org/arrays.html |
||||
|
########################## |
||||
|
# Array : construction d un tableau à partir d une ou plusieurs chaînes |
||||
|
# a="1 2" |
||||
|
# b="3 4" |
||||
|
# c=($a $b) |
||||
|
# c=($a) |
||||
|
# echo ${#c[@]} |
||||
|
# echo ${c[@]} |
||||
|
########################## |
||||
|
# AWK : iteration sur les champs, passage de valeurs via le paramètre "-v" |
||||
|
# $ echo "un deux trois quatre" | awk '{for(i=1;i<=NF;i++) printf $i" "; print ""}' |
||||
|
# $ echo "un deux trois" | awk -v n=2 '{print $n}' |
||||
|
# champs=$(echo "$qcm" | awk -F "," -v field=$num_champs '{print $field}') |
||||
|
# |
||||
|
# |
||||
|
# |
||||
|
########################## |
||||
|
# arithmetic : bash only support arithmetic integer operations, that's not the case with zsh |
||||
|
# |
||||
|
# incrementer de 3 une variable : |
||||
|
# (( a += 3 )) |
||||
|
# |
||||
|
# |
||||
|
# $(( < expr arithmetique quelconque avec des entiers uniquement pas de valeurs décimales autorisées avec bash > )) |
||||
|
# a=$((3 * 4 + 2)) |
||||
|
# y=$(($a + 1)) ou y=$(( a + 1)) |
||||
|
# |
||||
|
# calcul decimal/flottant : bc command pour du calcul décimal/float |
||||
|
# |
||||
|
# attention à l usage du '$' qui n est valable que lorsque les variables sont celles définies dans le shell: |
||||
|
# |
||||
|
# x=$(echo "1.2 + 1.3" | bc -l) |
||||
|
# a=1.2; b=2.3; echo "$a+$b" | bc -l |
||||
|
# echo "y=1.22; z=2.33; y+z" | bc -l |
||||
|
# |
||||
|
# récupération de la valeur : |
||||
|
# |
||||
|
# x=`echo "12 + 5" | bc` |
||||
|
# x=$(echo "12 + 5" | bc -l) |
||||
|
|
||||
|
########################## |
||||
|
#If then else statement https://stackoverflow.com/questions/6270440/simple-logical-operators-in-bash |
||||
|
# ( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok" |
||||
|
# var1=20 |
||||
|
# var2=22 |
||||
|
# [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2" |
||||
|
# |
||||
|
# a=3; if [ $a = 1 ]; then echo 1; elif [ $a = 2 ]; then echo 2; else echo toto; fi |
||||
|
########################## |
||||
|
|
||||
|
|
||||
|
|
||||
|
########################## |
||||
|
# variables GLOBALES |
||||
|
########################## |
||||
|
|
||||
|
### structure du fichier d'export des données de réponses qcm : |
||||
|
### nombre de sous-questions pour chaque question |
||||
|
nombre_sous_reponses=\ |
||||
|
"1 1 1 1 3 3 3 1 3 3\ |
||||
|
3 3 3 1" |
||||
|
#typesq est un tableau |
||||
|
#typesq=(${tq1} ${tq2}) |
||||
|
typesq=($nombre_sous_reponses) |
||||
|
### |
||||
|
solution="206","GEDEAS","Yaëlle","B1 _C1",\ |
||||
|
"d'ajouter/modifier/supprimer des pages web facilement",\ |
||||
|
"à occulter de l'information cachée aux lecteurs afin de transmettre un code secret",\ |
||||
|
"récupérer des informations structurées via le web",\ |
||||
|
"pour décrire la configuration d'un logiciel",\ |
||||
|
"Oui","Non","Non",\ |
||||
|
"Non","Non","Oui",\ |
||||
|
"Oui","Oui","Oui",\ |
||||
|
"n'importe quel éditeur de texte le + simple possible",\ |
||||
|
"Non","Oui","Oui",\ |
||||
|
"Non","Oui","Oui",\ |
||||
|
"Oui","Non","Oui",\ |
||||
|
"Oui","Oui","Non",\ |
||||
|
"Oui","Non","Non",\ |
||||
|
"ce que vous voyez est ce que vous obtenez" |
||||
|
|
||||
|
eleve="207","BRUNO","Javotte","B1 _C1",\ |
||||
|
"d'ajouter/modifier/supprimer des pages web facilement",\ |
||||
|
"à occulter de l'information cachée aux lecteurs afin de transmettre un code secret",\ |
||||
|
"récupérer des informations structurées via le web",\ |
||||
|
"pour décrire la configuration d'un logiciel",\ |
||||
|
"Oui","Non","Non",\ |
||||
|
"Non","Non","Oui",\ |
||||
|
"Oui","Oui","Oui",\ |
||||
|
"n'importe quel éditeur de texte le + simple possible",\ |
||||
|
"Non","Oui","Oui",\ |
||||
|
"Non","Oui","Oui",\ |
||||
|
"Oui","Non","Oui",\ |
||||
|
"Oui","Oui","Non",\ |
||||
|
"Oui","Non","Non",\ |
||||
|
"ce que vous voyez est ce que vous obtenez" |
||||
|
|
||||
|
|
||||
|
########################## |
||||
|
# Fonctions |
||||
|
########################## |
||||
|
|
||||
|
nb_questions() |
||||
|
{ |
||||
|
echo "${#typesq[@]}" |
||||
|
} |
||||
|
|
||||
|
#### |
||||
|
# |
||||
|
# $1 : numéro de la question |
||||
|
# |
||||
|
nb_sous_reponses() |
||||
|
{ |
||||
|
echo ${typesq[$(($1-1))]} |
||||
|
} |
||||
|
|
||||
|
#### |
||||
|
# Calculer la postion du champs où commence la réponse pour la questions N |
||||
|
# $1 : numero de la question (>0) |
||||
|
# |
||||
|
function index_champs_reponses_n () |
||||
|
{ |
||||
|
n=$1 |
||||
|
|
||||
|
# initialisation de l'index à 5 pour le premier champs de la première réponse |
||||
|
index_champs=5 |
||||
|
sous_reponses_precedentes=0 |
||||
|
|
||||
|
i=1 |
||||
|
while [ $i -le $n ] |
||||
|
do |
||||
|
index_champs=$((${index_champs} + ${sous_reponses_precedentes})) |
||||
|
sous_reponses_precedentes=${typesq[(($i-1))]} |
||||
|
((i++)) |
||||
|
done |
||||
|
|
||||
|
echo "$index_champs" |
||||
|
} |
||||
|
|
||||
|
#### |
||||
|
# Est-ce qu'une question donnée est une question à choix multiple ? |
||||
|
# $1 : numero de la question |
||||
|
# |
||||
|
question_a_choix_multiple () |
||||
|
{ |
||||
|
#[ $(nb_questions $1) -gt 1 ] |
||||
|
#($(nb_questions $1) > 1) |
||||
|
# la fonction 'nb_sous_reponses' appelle la fonction 'echo' pour retourner sa valeur |
||||
|
a=`nb_sous_reponses $1` |
||||
|
[[ $a -gt 1 ]] |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
#### |
||||
|
# Pour un "numéro de question donné en paramètre" ('$1'), "retourne une chaîne" qui correspond soit à : |
||||
|
# - réponse unique (question de "type L" = Liste de "radio boutons"). Ex : "d'ajouter/modifier/supprimer des pages web facilement" |
||||
|
# - réponse multiple (question de "type M" = liste choix Multiples). Ex : "Oui Non Oui" |
||||
|
# $1 : numero de la question |
||||
|
# $2 : réponses d'un qcm |
||||
|
function reponses_n () |
||||
|
{ |
||||
|
n=$1 |
||||
|
qcm=$2 |
||||
|
|
||||
|
# nombre de sous-réponses pour la réponse n |
||||
|
nbs=${typesq[$(($n-1))]} |
||||
|
|
||||
|
# stocker toutes les sous-réponses de la question n |
||||
|
reponse="" |
||||
|
|
||||
|
pos=$(index_champs_reponses_n $n) |
||||
|
|
||||
|
i=1 |
||||
|
while [ $i -le $nbs ] |
||||
|
do |
||||
|
j=$(($i-1)) |
||||
|
num_champs=$(($pos+$j)) |
||||
|
champs=$(echo "$qcm" | awk -F "," -v field=$num_champs '{print $field}') |
||||
|
|
||||
|
# test awk pour prendre en compte la virgule dans la réponse : ne donne pas satisfaction |
||||
|
#https://www.unix.com/shell-programming-and-scripting/154945-awk-multiple-character-delimiter.html |
||||
|
#champs=$(echo "$qcm" | awk -v field=$num_champs 'BEGIN {FS="[,]+";}{print $field}') |
||||
|
|
||||
|
#reponse="$reponse $champs" |
||||
|
#([ $i -eq 1 ] && echo "champs = $champs" && reponse="$champs" && echo "reponse = $reponse") || reponse+=" $champs" |
||||
|
if [ $i -eq 1 ]; then reponse="$champs"; else reponse+=" $champs"; fi |
||||
|
|
||||
|
((i++)) |
||||
|
done |
||||
|
echo "$reponse" |
||||
|
|
||||
|
} |
||||
|
|
||||
|
#### |
||||
|
# Comparer les sous-reponses de deux qcm pour la question N |
||||
|
# $1 : numéro de la question |
||||
|
# $2 : qcm |
||||
|
# $3 : qcm |
||||
|
function reponses_identiques_n () |
||||
|
{ |
||||
|
n=$1 |
||||
|
qcm_1=$2 |
||||
|
qcm_2=$3 |
||||
|
|
||||
|
echo "*** debug reponses_identiques_n $n" |
||||
|
r1=$(reponses_n $n "$qcm_1") |
||||
|
r2=$(reponses_n $n "$qcm_2") |
||||
|
echo "* r1 : $r1 / r2 : $r2 *" |
||||
|
|
||||
|
|
||||
|
[ "$r1" == "$r2" ] |
||||
|
# si le test est vrai retourne 0 sinon retourne 1 |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#### |
||||
|
# Compare séquentiellement 2 qcm jusqu'à rencontrer une différence entre les réponses. |
||||
|
# Retourne un Exit status = numéro de la réponse pour laquelle on rencontre une différence |
||||
|
# $1 : qcm |
||||
|
# $2 : qcm |
||||
|
qcm_identiques () |
||||
|
{ |
||||
|
|
||||
|
qcm_1=$1 |
||||
|
qcm_2=$2 |
||||
|
i=1 |
||||
|
|
||||
|
while [ $i -le $(nb_questions) ] |
||||
|
do |
||||
|
#if reponses_identiques_n $i "$qcm_1" "$qcm_2" |
||||
|
#then |
||||
|
# ((i++)) |
||||
|
#else |
||||
|
# #echo "différence : réponse #$i" |
||||
|
# return |
||||
|
#fi |
||||
|
|
||||
|
# alternative If...Then...Else : |
||||
|
reponses_identiques_n $i "$qcm_1" "$qcm_2" && ((i++)) && echo "$i" || return |
||||
|
done |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
#### |
||||
|
# Compter le nombre de réponses juste d'un qcm à évaluer par rapport au qcm de référence |
||||
|
# |
||||
|
|
||||
|
# $1 : qcm de référence |
||||
|
# $2 : qcm à noter |
||||
|
compter_nb_reponses_justes () |
||||
|
{ |
||||
|
qref=$1 |
||||
|
qeval=$2 |
||||
|
# nombre de réponses justes |
||||
|
nb_reponses_justes=0 |
||||
|
|
||||
|
# |
||||
|
i=1 |
||||
|
while [ "$i" -le "$(nb_questions)" ] |
||||
|
do |
||||
|
reponses_identiques_n $i "$qref" "$qeval" && ((nb_reponses_justes++)) |
||||
|
((i++)) |
||||
|
done |
||||
|
|
||||
|
echo $nb_reponses_justes |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#### |
||||
|
# Nombre de réponses à choix multiples qui sont 'fausses' pour une question à choix multiples |
||||
|
# |
||||
|
# Pour rappel le format d'une réponse multiple est la suivante : "Oui Non Oui [...] Non" |
||||
|
# $1 : numero de la question à évaluer |
||||
|
# $2 : qcm de référence |
||||
|
# $3 : qcm dont une réponse est à évaluer relativement au qcm de référence |
||||
|
choix_multiples_nb_reponses_fausses () |
||||
|
{ |
||||
|
num_q=$1 |
||||
|
nb_choix=$(nb_sous_reponses $num_q) |
||||
|
#nombre de sous-réponse de la question à choix multiple |
||||
|
|
||||
|
if [ $nb_choix -eq 1 ] |
||||
|
then |
||||
|
# erreur |
||||
|
return 1 |
||||
|
else |
||||
|
# la question est une question à choix multiple |
||||
|
qr=$2 |
||||
|
qe=$3 |
||||
|
reponse_r=($(reponses_n $num_q "$qr")) |
||||
|
reponse_e=($(reponses_n $num_q "$qe")) |
||||
|
reponses_fausses=0 |
||||
|
|
||||
|
i=1 |
||||
|
while [ $i -le $nb_choix ] |
||||
|
do |
||||
|
[ "${reponse_r[(($i-1))]}" != "${reponse_e[(($i-1))]}" ] && ((reponses_fausses++)) |
||||
|
((i++)) |
||||
|
done |
||||
|
fi |
||||
|
|
||||
|
echo "$reponses_fausses" |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#### |
||||
|
# Noter de manière assez cool un qcm. |
||||
|
# On attribue : |
||||
|
# '0.5' points pour les questions à choix multiples pour lesquelles il y a UNE ET UNE SEULE réponses fausse |
||||
|
# '1.0' points pour toute question dont la réponse est parfaite |
||||
|
# $1 : qcm de référence |
||||
|
# $2 : qcm à noter |
||||
|
note_laxiste_qcm () |
||||
|
{ |
||||
|
qref=$1 |
||||
|
qeval=$2 |
||||
|
# evaluation du qcm |
||||
|
note=0 |
||||
|
|
||||
|
# |
||||
|
i=1 |
||||
|
while [ "$i" -le "$(nb_questions)" ] |
||||
|
do |
||||
|
reponses_identiques_n $i "$qref" "$qeval" && note=$(echo "$note + 1" | bc -l) |
||||
|
|
||||
|
# cas réponse non-identique : |
||||
|
if [ $? -eq 1 ] |
||||
|
then |
||||
|
# si la questions est à choix multiples : |
||||
|
if ($(nb_sous_reponses $i) > 1) |
||||
|
then |
||||
|
if (choix_multiples_nb_reponses_fausses |
||||
|
else |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
|
||||
|
else |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
|
||||
|
((i++)) |
||||
|
done |
||||
|
|
||||
|
echo $note |
||||
|
} |
||||
|
|
||||
|
#### |
||||
|
# fonction de déboggage |
||||
|
# Afficher toutes les réponses d'un qcm |
||||
|
# $1 : qcm |
||||
|
# |
||||
|
debug_reponses_n () |
||||
|
{ |
||||
|
qcm="$1" |
||||
|
|
||||
|
i=1 |
||||
|
while [ $i -le $(nb_questions) ] |
||||
|
do |
||||
|
echo "$i" |
||||
|
echo "$(reponses_n $i "$qcm")" |
||||
|
((i++)) |
||||
|
done |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
########################## |
||||
|
# Main |
||||
|
########################## |
||||
|
|
||||
|
|
||||
|
#echo "nombre de questions : $(nb_questions)" |
||||
|
|
||||
|
#i=1 |
||||
|
#question_a_choix_multiple $i |
||||
|
#ret=$? |
||||
|
#echo "Est-ce que la question $i est à choix multiple ? : $ret" |
||||
|
|
||||
|
#i=14 |
||||
|
#echo -n "debug sur la question $i, est-elle identique ? : " |
||||
|
#reponses_identiques_n $i "$solution" "$eleve" |
||||
|
#echo $? |
||||
|
|
||||
|
#debug_reponses_n "$eleve" |
||||
|
|
||||
|
|
||||
|
exit |
Write
Preview
Loading…
Cancel
Save
Reference in new issue