Probleme de syntaxe dans ma boucle while

Résolu
artanis -  
 artanis -
Bonjour,


je dois faire un petit bash pour automatiser la récupération de documentations sur un site
et il doit s'éffectuer toutes les 4 semaines


j'ai fais une ébauche mais au moment de le tester le terminal me dit qu'il y a une erreur de syntaxe a la ligne 41 et ferme prématurément mon programme


ce qui m'ennuie c'est que je ne vois pas trop quel érreure de syntaxe j'aurai pu faire... vue que la ligne dont il parle est mon "done" de fin de while...


help?


voila mon script :


#!/bin/bash

while [ choix = 1 ]
do

frequence=4
#corespondant a 4 semaines
dest='smb://lnx-mail/keriobackup/lenze'
#chemin par défaut

echo '1 lancer la mise a jour avec les derniers parametres'
echo '2 changer l adresse de destination'
echo '3 changer la frequence'

(je devrai implanter plus tard le changement d'adresse de destination avec une variable pour le moment il ne fait rien a part charger une chaine de charactère dans une variable.)

read choix

if $choix = 1
then {
wget -r -k -np -P $smb://lnx-mail/keriobackup/lenze --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/en
wget -r -k -np -P $smb://lnx-mail/keriobackup/lenze --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/fr
wget -r -k -np -P $smb://lnx-mail/keriobackup/lenze --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/de
$ at now +$frequence minutes
}
fi

if $choix = 2
then {
echo 'saisissez l adresse de destination \( exemple \: smb\:\/\/lnx\-mail\/keriobackup\/lenze\)'
read dest
}
fi

if $choix = 3
then {
echo 'saisissez le nombre de semaines entre chaques mises a jour'
read frequence
}
fi
done

3 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
#!/bin/bash


frequence=4
#corespondant a 4 semaines =>valleurs par défaut
dest='smb://lnx-mail/keriobackup/lenze'
#chemin par défaut =>

while true
#=>au moins une fois de téléchager
do
echo
echo '1 lancer la mise a jour avec les derniers parametres'
echo '2 changer l adresse de destination'
echo '3 changer la frequence'

read -p "Votre choix : " choix

case "${choix}" in
1)	echo "wget -r -k -np -P ${dest} --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/en"
	echo "wget -r -k -np -P ${dest} --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/fr"
	echo "wget -r -k -np -P ${dest} --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/de"
	echo "at now +$frequence minutes" #=>relance le programme au bout d'un certain temps
	echo "bash premiertest.sh" #=> nom du programme
	break
	;;
2)	echo 'saisissez l adresse de destination ( exemple : smb://lnx-mail/keriobackup/lenze)'
	read -p "Nouvelle destination : " dest
	echo "Nouvelle adresse : ${dest}"
	continue
	;;
3)	echo 'saisissez le nombre de semaines entre chaques mises a jour'
	read -p "Nouvelle fréquence : " frequence
	echo "Nouvelle fréquence : ${frequence}"
	continue
	;;
*)	echo "Mauvais choix ! Recommencez s'il vous plaît."
	continue
	;;
esac
done


Zen my nuggets ;-)
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
1
artanis
 
J'ai testé le script et il me dit qu'il y a une erreure de syntaxe dans les zonnes en gras

case "${choix}" in
1) echo "wget -r -k -np -P $smb://lnx-mail/keriobackup/lenze --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/en"
echo "wget -r -k -np -P $smb://lnx-mail/keriobackup/lenze --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/fr"
echo "wget -r -k -np -P $smb://lnx-mail/keriobackup/lenze --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/de"
echo "at now +$frequence minutes" #=>relance le programme au bout d'un certain temps
echo "bash premiertest.sh" #=> nom du programme
break
;;
2) echo 'saisissez l adresse de destination ( exemple : smb://lnx-mail/keriobackup/lenze)'
read -p "Nouvelle destination : " dest
echo "Nouvelle adresse : ${dest}"
continue
;;
3) echo 'saisissez le nombre de semaines entre chaques mises a jour'
read -p "Nouvelle fréquence : " frequence
echo "Nouvelle fréquence : ${frequence}"
continue
;;
*) echo "Mauvais choix ! Recommencez s'il vous plaît."
continue
;;


Je commence a me demander si j'ai bien la bonne version de linux...
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Entre temps j'ai modifié les "$smb://lnx-mail/keriobackup/lenze" en "${dest}" que j'avais oublié ;-((

Mais même sans ça chez moi ça marche (bash : GNU bash, version 4.2.10(2)-release (x86_64-mandriva-linux-gnu))

$ ./foo.sh 

1 lancer la mise a jour avec les derniers parametres
2 changer l adresse de destination
3 changer la frequence
Votre choix : 2
saisissez l adresse de destination ( exemple : smb://lnx-mail/keriobackup/lenze)
Nouvelle destination : lalala
Nouvelle adresse : lalala

1 lancer la mise a jour avec les derniers parametres
2 changer l adresse de destination
3 changer la frequence
Votre choix : 3
saisissez le nombre de semaines entre chaques mises a jour
Nouvelle fréquence : 7
Nouvelle fréquence : 7

1 lancer la mise a jour avec les derniers parametres
2 changer l adresse de destination
3 changer la frequence
Votre choix : 1
wget -r -k -np -P lalala --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/en
wget -r -k -np -P lalala --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/fr
wget -r -k -np -P lalala --user-agent=Firefox http://src.lenze.com/lenze-bibliothek/de
at now +7 minutes
bash premiertest.sh
0
artanis
 
Bon ben merci bien c'est donc clair que le problème est de mon coté merci beaucoup de m'avoir aidé =)
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Salut,

La syntaxe d'un test est plutôt du genre :
if [ "${choix}" -eq 1 ]
then ...
fi

ou
if [[ ${choix} -eq 1 ]]
then ...
fi

Dans ton cas un "case ... esac" serait peut être plus approprié, non ?
0
artanis
 
Enfait j'apprends a faire des bash donc je ne connais pas tout ce que je peux faire j'ai quelques notions en C alors voyant que je vouvais faire des if j'ai pas cherché plus loin... Ca pourrait regler le problème de mon while si je faisait des case?
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Tu peux faire avec des "if...then...else...fi", mais alors il faut revoir l'ordre de tes tests et la priorité accordée à chaque item en fonction des choix ;-\

Déjà il te faudrait définir la fréquence et l'adresse avant la boucle, puis tester en 1er si ces deux valeurs doivent être changées et enfin lancer la mise à jour avec les nouvelles valeurs et/ou celles par défaut, non ?
0
artanis
 
j'ai changé la position des valeurs par défaut... Il est vrai que si c'est pas dans la boucle ca marchera un peu mieux xD
Mais pourquoi changer l'ordre des test de choix puisque de toutes facons un seul sur les trois s'éffectuera...
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Pas l'ordre des tests de choix à proprement dit (pas l'affichage si tu préfères), mais l'ordre des tests effectués par le script...

Le script doit d'abord tester si l'adresse a changé avant de faire la mise à jour, ce qui me parait logique, non ?
0
artanis
 
alors cette partie n'est pas encore implantée mais je pensais mettre une variable à la place du chemin de destination dans la commande wget (j'ai pas encore regardé si je pouvais le faire soit dit en passant)

mais je ne vois pas pourquoi changer l'ordre d'exécution des scripts : si l'utilisateur entre 3 il va changer la fréquence puis le script va recommencer au niveau du choix . Si il décide alors de faire la mise a jour la fréquence sera celle qu'il a rentré plus haut...

Je comprends pas ce que t'éssaie de me dire donne moi un expemple s'il te plait
0
artanis
 
Au final j'ai trouvé d'ou venait le problème, Le fait est que j'ai créer le programme dans le bloc note windows et qu'il gère mal les saut de lignes (d'ou mes erreures de syntaxe).
Il m'a suffit de ré écrire le programme dans un éditeur de texte linux tel que gedit pour que tout se mette a fonctionner sans aucun soucis.
0