#1 Le 17/05/2015, à 13:18
- cerulean
[ RESOLU ] commandes "while" "continue" et "shift"
Bonjour,
Ça fait plusieurs jours que je n'arrive pas à faire que ce script s'exécute comme il faudrait ...
Mes questions et remarques sont en commentaires.
#!/bin/bash
# A VOIR !!!
# minmax.sh
# Commandes shift et while
# Saisie sécurisée de 3 nb, puis classement croissant.
essai=1
while [ $essai -ne 4 ]
do
read -p "Exam $essai : " note
if [ $note -lt 0 ]; then continue; fi # conditionne saisie d'un nb positif pour que $(($essai+1)) se fasse (?)
# "continue" avec la commande "if" signifie : si la condition n'est pas satisfaite, alors ne passe pas à l'itération suivante, et continue de boucler dans la commande précédente ( ? ) c'est bien ça ?
# ici, ça revient à : si le nb est négatif, alors ne passe pas à l'itération suivante :
essai=$(($essai + 1))
done
set $note
min=$1
max=$1
while [ $# -ne 0 ]
do
if [ $1 -lt $min ]; then $min=$1; fi # là j'dois dire que ça me laisse dans une grande perplexité ... Y'a une erreur d'attribution c'est pas possible autrement ...
if [ $1 -gt $max ]; then $max=$1; fi
shift
done
echo "Liste des notes : $note" # COMMENT PEUT-ON AVOIR LA LISTE DE TOUTES LES NOTES SI ON LES "SHIFT" ??? Nécessairement ne reste que la dernière saisie.
echo "Minimale : $min"
echo "Maximale : $max"
exit 0
Merci de votre aide, de vos lumières et de votre indulgence.
Dernière modification par cerulean (Le 17/05/2015, à 18:29)
Hors ligne
#2 Le 17/05/2015, à 13:41
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
salut,
comment peut-on avoir la liste de toutes les notes si on les "shift" ?
soit, dans la première boucle, tu utilises un tableau :
notes+=( $note )
et alors, la boucle suivante sera une boucle for,
soit :
set -- $@ $note
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 17/05/2015, à 14:17
- cerulean
Re : [ RESOLU ] commandes "while" "continue" et "shift"
Salut,
Merci de ta réponse,
Ta 1ère solution a l'air sympa, malheureusement je n'ai pas encore vu la notion de tableau ...
Il s'agit en fait d'un exo ayant pour but d'apprendre à maîtriser while ...
Je suis en train d'essayer de comprendre ta 2nde solution ...
Hors ligne
#4 Le 17/05/2015, à 14:33
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
ma deuxième proposition est à insérer aussi dans la première boucle (il faut donc retirer l'instruction set qui la suit).
-- Évite de prendre les éventuels paramètres qui comenceraient par - pour des options de set.
$@ Se développe en l'ensemble des paramètres positionnels.
donc, on inscrit l'ensemble des paramètres positionnels et $note en tant que paramètres positionnels
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 17/05/2015, à 15:41
- cerulean
Re : [ RESOLU ] commandes "while" "continue" et "shift"
ok, j'crois que je vois.
Néanmoins à l'exécution du script le même problème se pose. Il n'y a que la dernière entrée qui s'affiche dans "Liste des notes", et $min comme $max prennent elles aussi la valeur de la dernière entrée :
dyt@ubuntu:~/exo$ ./minmax3.sh
Exam 1 : 8
Exam 2 : 5
Exam 3 : 2
./minmax3.sh: ligne 28: 2=5 : commande introuvable
./minmax3.sh: ligne 28: 2=8 : commande introuvable
Liste des notes : 2
Minimale : 2
Maximale : 2
dyt@ubuntu:~/exo$
Comme le dit bash il une erreur au niveau des "if" de la 2nde boucle "while".
Il y a une coquille dans le corrigé du bouquin d'exo et je n'arrive pas à la déterminer ...
Il est en plus fort possible que je n'ai pas tout compris à la solution que tu proposes, je continue de chercher ...
Hors ligne
#6 Le 17/05/2015, à 15:53
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
on y verra plus clair avec la nouvelle version du script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 17/05/2015, à 16:06
- cerulean
Re : [ RESOLU ] commandes "while" "continue" et "shift"
exact
dyt@ubuntu:~/exo$ cat -n minmax4.sh
1 #!/bin/bash
2
3 # A VOIR !!!
4 # Commandes shift et while
5 # Saisie sécurisée de 3 nb, puis classement croissant.
6
7 essai=1
8 while [ $essai -ne 4 ]
9 do
10 read -p "Exam $essai : " note
11
12 if [ $note -lt 0 ]; then continue; fi
13 essai=$(($essai + 1))
14 set -- $note $@ # Insérer ici bash précise l'erreur
15 done
16
17 #set $note
18 min=$1
19 max=$1
20
21 while [ $# -ne 0 ]
22 do
23
24 if [ $1 -lt $min ]; then $min=$1; fi
25 if [ $1 -gt $max ]; then $max=$1; fi
26
27 shift
28 done
29
30 echo "Liste des notes : $note "
31 echo "Minimale : $min"
32 echo "Maximale : $max"
33
34 exit 0
dyt@ubuntu:~/exo$
à l'exécution :
dyt@ubuntu:~/exo$ ./minmax4.sh
Exam 1 : 8
Exam 2 : 5
Exam 3 : 2
./minmax4.sh: ligne 25: 2=5 : commande introuvable
./minmax4.sh: ligne 25: 2=8 : commande introuvable
Liste des notes : 2
Minimale : 2
Maximale : 2
dyt@ubuntu:~/exo$
Hors ligne
#8 Le 17/05/2015, à 16:17
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
$min=$1
min=$1
pareil pour max !
Dernière modification par Watael (Le 17/05/2015, à 16:19)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 17/05/2015, à 16:36
- cerulean
Re : [ RESOLU ] commandes "while" "continue" et "shift"
ooops ... le bouquin n'y était pour rien ...
Aussi je te remercie de m'aider, vraiment.
Ça corrige echo "Minimale : " et echo "Maximale : "
"echo "Liste de notes : $note" indique toujours la dernière entrée
#!/bin/bash
# A VOIR !!!
# Commandes shift et while
# Saisie sécurisée de 3 nb, puis classement croissant.
essai=1
while [ $essai -ne 4 ]
do
read -p "Exam $essai : " note
if [ $note -lt 0 ]; then continue; fi
essai=$(($essai + 1))
set -- $@ $note #
done
#set $note
min=$1
max=$1
while [ $# -ne 0 ]
do
if [ $1 -lt $min ]; then min=$1; fi
if [ $1 -gt $max ]; then max=$1; fi
shift
done
echo "Liste des notes : $note "
echo "Minimale : $min"
echo "Maximale : $max"
exit 0
à l'exécution :
dyt@ubuntu:~/exo$ ./minmax4.sh
Exam 1 : 8
Exam 2 : 5
Exam 3 : 2
Liste des notes : 2
Minimale : 2
Maximale : 8
dyt@ubuntu:~/exo$
Hors ligne
#10 Le 17/05/2015, à 16:52
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
oui, parce que ce n'est pas $note qui contient l'ensemble des notes, c'est $@.
sauf que cela a été "mangé" par les shift
remplace le dernier while par
for note do test $note -lt $min && min=$note; test $note -gt $max && max=$note; done
echo liste = $@
echo max = $max
echo min = $min
Dernière modification par Watael (Le 17/05/2015, à 16:58)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 17/05/2015, à 17:21
- cerulean
Re : [ RESOLU ] commandes "while" "continue" et "shift"
en effet je vois bien, mais j'ai dû insérer une erreur ailleurs pcq echo $@ me renvoie un champs vide. j'ai essayé avec avec echo $* et echo "$@" ça ne fonctionne pas non plus.
#!/bin/bash
# A VOIR !!!
# minmax5.sh
# Commandes shift et while
# Saisie sécurisée de 3 nb, puis classement croissant.
essai=1
while [ $essai -ne 4 ]
do
read -p "Exam $essai : " note
if [ $note -lt 0 ]; then continue; fi
essai=$(($essai + 1))
set -- $@ $note
done
#set $note
min=$1
max=$1
while [ $# -ne 0 ]
do
if [ $1 -lt $min ]; then min=$1; fi
if [ $1 -gt $max ]; then max=$1; fi
shift
done
echo "Liste des notes : $@"
echo "Minimale : $min"
echo "Maximale : $max"
exit 0
à l'exécution
dyt@ubuntu:~/exo$ ./minmax5.sh
Exam 1 : 8
Exam 2 : 5
Exam 3 : 2
Liste des notes :
Minimale : 2
Maximale : 8
dyt@ubuntu:~/exo$
Hors ligne
#12 Le 17/05/2015, à 17:33
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
oui, parce que ce n'est pas $note qui contient l'ensemble des notes, c'est $@.
sauf que cela* a été "mangé" par les shift
* $@
Dernière modification par Watael (Le 17/05/2015, à 17:34)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 17/05/2015, à 18:29
- cerulean
Re : [ RESOLU ] commandes "while" "continue" et "shift"
Il m'aura fallu l'après-midi pour comprendre ton 1er post ... : )
Encore merci Watael, ça marche (évidemment),
#!/bin/bash
# minmax6.sh
# Commandes shift et while
# Saisie sécurisée de 3 nb, puis classement croissant.
essai=1
while [ $essai -ne 4 ]
do
read -p "Exam $essai : " note
[ $note -lt 0 ] && continue
essai=$(($essai + 1))
set -- $@ $note
done
#set $note
min=$1
max=$1
for note
do
[ $note -lt $min ] && min=$note
[ $note -gt $max ] && max=$note
done
echo "Liste des notes : $@"
echo "Minimale : $min"
echo "Maximale : $max"
exit 0
à l'exécution :
dyt@ubuntu:~/exo$ ./minmax6.sh
Exam 1 : 8
Exam 2 : 5
Exam 3 : 2
Liste des notes : 8 5 2
Minimale : 2
Maximale : 8
dyt@ubuntu:~/exo$
Une question supplémentaire si tu permets ...
Y-a-t'il des cas où la strucuture "if ... fi" ne peut être remplacée par "test .. && ... et/ou/puis ... || ... " ?
Hors ligne
#14 Le 17/05/2015, à 18:46
- Watael
Re : [ RESOLU ] commandes "while" "continue" et "shift"
Y-a-t'il des cas où la strucuture "if ... fi" ne peut être remplacée par "test .. && ... et/ou/puis ... || ... " ?
des conditions simples, avec des commandes qui ne peuvent pas échouer, car les conditions sont exécutées séquentiellement (l'une après l'autre)
c'est pourquoi le résultat de cette commande est vrai :
$ true && false || true
$ echo $?
0
parce que le dernier true est exécuté, parce que la deuxième commande est fausse.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne