Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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,

cerulean a écrit :

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. wink


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 sad

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"

watael a écrit :

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 sad

* $@

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.
hmm


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne