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 01/09/2014, à 12:48

Le Goss

[Résolu] Bash: while imbriquées. C'est où que ça coince?

Bonjour à tous,

#!/bin/bash

clear
> fichiertest
while [ -z $nouveau ] || [ $nouveau != '0' ]
do
	while [ -z $ouinon ] || [ $ouinon != '1' ]
	do		
		read -p 'Nom : ' nom
		read -p 'Prénom : ' prenom
		echo -e "La nouvelle personne est : $nom $prenom"
		echo -e "Ce nom est-il exact (1/0) ?"
		read -p 'réponse : ' ouinon
	clear
	done
	echo -e "$nom - $prenom" >> fichiertest
	read -p 'Ajouter une autre personne à la liste (0 pour fermer le script) : ' nouveau
done

exit 0

J'arrive pas à trouver où je me suis planté... mad
Merci pour votre aide,
Cordialement

Dernière modification par Le Goss (Le 01/09/2014, à 14:35)


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#2 Le 01/09/2014, à 13:10

αjet

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Je viens de tester, ton script semble s'executer correctement (dans une console cygwin). Peux tu preciser quel est ton probleme ?


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#3 Le 01/09/2014, à 13:21

jplemoine

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Je pense qu'il y a un problème lors de l'ajout d'une 2ième personne :
Il faut réinitialiser $ouinon..
sinon comme $ouinon sera égal à '1' (dû à l’occurrence précédente),
et

while [ -z $ouinon ] || [ $ouinon != '1' ]

ne va pas faire rentrer dans la boucle et sortir en fin de boucle.
Le code qui suit la boucle va s'exécuter :

echo -e "$nom - $prenom" >> fichiertest

Donc, le nom et prénom va de réinscrire.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#4 Le 01/09/2014, à 13:36

Le Goss

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

alex63 a écrit :

Peux tu preciser quel est ton probleme ?

Je n'arrive pas à faire tourner la première boucle, celle qui décide de l'ajout ou pas d'une nouvelle personne.
Tant que je ne tape pas 0, la console me renvoie:

Ajouter une autre personne à la liste (0 pour fermer le script) : 
Ajouter une autre personne à la liste (0 pour fermer le script) : bla
Ajouter une autre personne à la liste (0 pour fermer le script) : 1

etc...
Et à chaque fois, une nouvelle ligne comportant les mêmes nom et prénom s'ajoute au fichier.

jplemoine a écrit :

Il faut réinitialiser $ouinon..

Je me disais bien que cette variable n'était pas étrangère à cette anomalie.
Mais comment je dois m'y prendre pour la réinitialiser?


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#5 Le 01/09/2014, à 13:49

pingouinux

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Bonjour,
Attention, si ouinon vaut 0, [ -z $ouinon ] renvoie faux

Hors ligne

#6 Le 01/09/2014, à 14:03

αjet

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Je tenterais d'initialiser la variable ouinon a 0 avant la deuxieme boucle while, ce qui a en outre l'avantage de simplifier la condition.

...
while [ -z $nouveau ] || [ $nouveau != '0' ]
do
        $ouinon = 0
	while [ $ouinon != '1' ]
	do		
...	

αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#7 Le 01/09/2014, à 14:14

Le Goss

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Au lancement du script:

test: ligne 7: = : commande introuvable
test: ligne 8 : [: != : opérateur unaire attendu
Ajouter une autre personne à la liste (0 pour non) : 

Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#8 Le 01/09/2014, à 14:18

Le Goss

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Si je mets:

alex63 a écrit :
 $ouinon = 0

ça coince toujours. Par contre, avec

ouinon=0

ça fonctionne!


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#9 Le 01/09/2014, à 14:20

αjet

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Ca doit etre une erreur de syntax de ma part. Tu peux mettre le sujet en [resolu]?


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#10 Le 01/09/2014, à 14:21

jplemoine

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

@pingouinux : il y a un ou... tant que ouinon n'est pas initialisé ou que ouinon est différent de 1
pour sortir, il faut donc que ouinon soit initialisé et égal à 1.

@Le Goss :

	done
	echo -e "$nom - $prenom" >> fichiertest
	read -p 'Ajouter une autre personne à la liste (0 pour fermer le script) : ' nouveau

devient

	done
	echo -e "$nom - $prenom" >> fichiertest
        if [[ "$ouinon" == "1" ]]
	  read -p 'Ajouter une autre personne à la liste (0 pour fermer le script) : ' nouveau
          ouinon = "0"
        fi

Personnellement, je préfère initialiser les variables plutôt que utiliser -z
Au tout début :
ouinon = 0
nouveau = 1

Et avant la deuxième boucle, nouveau = 0

Ça donne un truc du genre (à tester)

#!/bin/bash
# initialisation des variables
ouinon = 0
nouveau = 1
clear
#creation d'un fichier vide
touch fichiertest
# boucle 1
while [  $nouveau != '0' ]
do
       # réinitialisation systématique de nouveau
       nouveau = 0
        # boucle 2
	while [  $ouinon != '1' ]
	do
                # création d'un personne		
		read -p 'Nom : ' nom
		read -p 'Prénom : ' prenom
		echo -e "La nouvelle personne est : $nom $prenom"
		echo -e "Ce nom est-il exact (1/0) ?"
		read -p 'réponse : ' ouinon
	       clear
	done
        if [[ "$ouinon" == "1" ]]
          # si c'est correct, on crée le fichier et on demande une autre creation
	  echo -e "$nom - $prenom" >> fichiertest
	  read -p 'Ajouter une autre personne à la liste (0 pour fermer le script) : ' nouveau
          ouinon = "0"
        fi
done

exit 0

Comme ça, ça devrait fonctionner


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#11 Le 01/09/2014, à 14:34

Le Goss

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

jplemoine a écrit :

... Comme ça, ça devrait fonctionner

Avec un "then" et des " là où il faut, et une rectification à l'initialisation des variables (enlever les espace autour du signe = ), c'est OK:

#!/bin/bash
# initialisation des variables
ouinon=0
nouveau=1
clear
#creation d'un fichier vide
touch fichiertest
# boucle 1
while [ "$nouveau" != '0' ]
do
       # réinitialisation systématique de nouveau
       nouveau=0
        # boucle 2
	while [ "$ouinon" != '1' ]
	do
                # création d'un personne		
		read -p 'Nom : ' nom
		read -p 'Prénom : ' prenom
		echo -e "La nouvelle personne est : $nom $prenom"
		echo -e "Ce nom est-il exact (1/0) ?"
		read -p 'réponse : ' ouinon
	       clear
	done
        if [[ "$ouinon" == "1" ]]
		then
          # si c'est correct, on crée le fichier et on demande une autre creation
	  echo -e "$nom - $prenom" >> fichiertest
	  read -p 'Ajouter une autre personne à la liste (0 pour fermer le script) : ' nouveau
          ouinon="0"
        fi
done

exit 0

Merci à tous pour votre aide et vos précisions!
Sujet résolu!

Dernière modification par Le Goss (Le 01/09/2014, à 14:51)


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#12 Le 01/09/2014, à 14:41

jplemoine

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

oui. J'ai mal regardé mes scripts qui m'ont servi de modèle...

if [[ "$ouinon" == "1" ]]
		then

peut être écrit de manière plus compacte (utilisation de wink:

if [[ "$ouinon" == "1" ]]; then

pour l’initialisation des variables, tu dis qu'il faut supprimer les espaces (ce qui est fort possible) mais ils s'y sont dans le listing...
Peux-tu faire modifier du listing et le modifier, s'il y a une erreur ? ou confirmer que le listing posté ci-dessus est fonctionnel ?
Merci.

Dernière modification par jplemoine (Le 01/09/2014, à 14:41)


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#13 Le 01/09/2014, à 14:56

Le Goss

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

J'avais oublié les corrections au début du script, c'est fait.
Le script est fonctionnel.


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#14 Le 01/09/2014, à 14:58

jplemoine

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Super. Merci à toi.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#15 Le 02/09/2014, à 01:04

Postmortem

Re : [Résolu] Bash: while imbriquées. C'est où que ça coince?

Salut,
Me permet une petite précision concernant une des 1ère ligne du script posté en 1er :

while [ -z $nouveau ] || [ $nouveau != '0' ]

Au 1er passage, le test [ -z $nouveau ] est vrai non pas parce que $nouveau est nul ou non déclaré mais parce que la chaîne "-z" n'est pas de longueur nulle.
En effet, si $nouveau est nulle, le test effectué est [ -z ], ce qui correspond à ce test : [ -n "-z" ].
Entre simple crochets, il faut mettre les variables entre guillemets. Par contre, entre double crochets, les guillemets autour des variables ne sont pas nécessaires (mais rien n'empêche de les mettre ! )
Il faut donc écrire :

[ -z "$nouveau" ]
# ou
[[ -z $nouveau ]]
# ou
[[ -z "$nouveau" ]]

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne