Problème avec une boucle for

Problème avec une boucle for - Shell/Batch - Programmation

Marsh Posté le 14-09-2008 à 16:14:07    

Salut a tous
 
je suis en trains de faire un script de backup mais j'ai une erreur et je pense qu'elle vient de ma boucle for qui fait une boucle sur les répertoires, etc, home et var pour pouvoir les sauvegarder avec rsync. Voilà le script:
 

Code :
  1. #!/bin/bash
  2. # Les Variables
  3. REP_BACKUP="/opt/backup/passerelle"
  4. # Début du Backup
  5. echo "Début de la sauvegarde le `date +%D` à `date +%H:%M`"
  6. # Boucle sur les répertoire etc, home et var
  7. for REP in etc home var ;  do
  8. echo "    *    Sauvegarde de  $REP_BACKUP"
  9. # Suprimmer le 5eme Jour de la 2eme Semaines
  10. if [ -d $REP_BACKUP/jour.5.semaine.2 ];
  11. then
  12. rm -r $REP_BACKUP/jour.5.semaine.2 ;
  13. fi;
  14. # 2eme Semaines
  15. if [ -d $REP_BACKUP/jour.4.semaine.2 ];
  16. then
  17. mv  $REP_BACKUP/jour.4.semaine.2 $REP_BACKUP/jour.5.semaine.2 ;
  18. fi;
  19. if [ -d $REP_BACKUP/jour.3.semaine.2 ];
  20. then
  21. mv $REP_BACKUP/jour.3.semaine.2 $REP_BACKUP/jour.4.semaine.2 ;
  22. fi;
  23. if [ -d $REP_BACKUP/jour.2.semaine.2 ];
  24. then
  25. mv $REP_BACKUP/jour.2.semaine.2 $REP_BACKUP/jour.3.semaine.2 ;
  26. fi;
  27. if [ -d $REP_BACKUP/jour.1.semaine.2 ];
  28. then
  29. mv $REP_BACKUP/jour.1.semaine.2 $REP_BACKUP/jour.2.semaine.2 ;
  30. fi;
  31. if [ -d $REP_BACKUP/jour.0.semaine.2 ];
  32. then
  33. mv $REP_BACKUP/jour.0.semaine.2 $REP_BACKUP/jour.1.semaine.2 ;
  34. fi;
  35. # 1eme Semaines
  36. if [ -d $REP_BACKUP/jour.4.semaine.1 ];
  37. then
  38. mv $REP_BACKUP/jour.4.semaine.1 $REP_BACKUP/jour.0.semaine.2 ;
  39. fi;
  40. if [ -d $REP_BACKUP/jour.3.semaine.1 ];
  41. then
  42. mv $REP_BACKUP/jour.3.semaine.1 $REP_BACKUP/jour.4.semaine.1 ;
  43. fi;
  44. if [ -d $REP_BACKUP/jour.2.semaine.1 ];
  45. then
  46. mv $REP_BACKUP/jour.2.semaine.1 $REP_BACKUP/jour.3.semaine.1 ;
  47. fi;
  48. if [ -d $REP_BACKUP/jour.1.semaine.1 ];
  49. then
  50. mv $REP_BACKUP/jour.1.semaine.1 $REP_BACKUP/jour.2.semaine.1 ;
  51. fi;
  52. if [ -d $REP_BACKUP/jour.0.semaine.1 ];
  53. then
  54. mv $REP_BACKUP/jour.0.semaine.1 $REP_BACKUP/jour.1.semaine.1 ;
  55. fi;
  56. # Syncronisation du REP_BACKUP
  57. rsync -ra --delete --link-dest=$REP_BACKUP/jour.1.semaine.1 $REP $REP_BACKUP/jour.0.semaine.1
  58. # Fin du Backup
  59. echo "Fin de la sauvegarde le `date +%D` à `date +%H:%M`"
  60. echo "========================================"


 
et l'erreur:

Code :
  1. # ./snapshot_leopard.sh
  2. Début de la sauvegarde le 09/14/08 à 16:24
  3. ./snapshot_leopard.sh: line 85: syntax error: unexpected end of file


 
merci de votre aide.

Reply

Marsh Posté le 14-09-2008 à 16:14:07   

Reply

Marsh Posté le 14-09-2008 à 16:18:59    

heu, tu n'aurais pas oublié le "done" ?

Reply

Marsh Posté le 14-09-2008 à 16:58:35    

et je le met ou? dsl je suis vraiment pas un pro du shell.

Reply

Marsh Posté le 14-09-2008 à 17:01:28    

cf man bash

Citation :

for name [ in word ] ; do list ; done
              The list of words following in is expanded, generating a list of
              items.  The variable name is set to each element of this list in
              turn,  and  list is executed each time.  If the in word is omit?
              ted, the for command executes  list  once  for  each  positional
              parameter that is set (see PARAMETERS below).  The return status
              is the exit status of the last command that  executes.   If  the
              expansion of the items following in results in an empty list, no
              commands are executed, and the return status is 0.

Reply

Marsh Posté le 14-09-2008 à 17:11:40    

ok, merci beaucoup ça marche.

Reply

Marsh Posté le 14-09-2008 à 18:13:35    

j'ai une autre question
 
J'ai cette ligne: echo "Début de la sauvegarde le `date +%D` à `date +%H:%M` " >> $LOG
 
et >> $LOG correspond à quoi? il semblerai que ça soit pour écrire dans un fichier log mais sa ne marche pas.

Reply

Marsh Posté le 14-09-2008 à 18:18:27    

hppp a écrit :

j'ai une autre question
 
J'ai cette ligne: echo "Début de la sauvegarde le `date +%D` à `date +%H:%M` " >> $LOG
 
et >> $LOG correspond à quoi? il semblerai que ça soit pour écrire dans un fichier log mais sa ne marche pas.


ce ne serait pas un copier/coller foireux  provenant d'un site web (page HTML) ?
tu devrais avoir  

Code :
  1. echo "Début de la sauvegarde le `date +%D` à `date +%H:%M` " >> $LOG

Message cité 1 fois
Message édité par jlighty le 14-09-2008 à 18:19:04
Reply

Marsh Posté le 14-09-2008 à 18:56:46    

jlighty a écrit :


ce ne serait pas un copier/coller foireux  provenant d'un site web (page HTML) ?
tu devrais avoir  

Code :
  1. echo "Début de la sauvegarde le `date +%D` à `date +%H:%M` " >> $LOG



si  :D , ok merci

Reply

Marsh Posté le 14-09-2008 à 19:12:44    

je vous embête une dernier fois, je voudrai aussi qu'un mail soit envoyé à la fin du backup avec les echo dans le corp et pas en pièces joint, j'ai trouvé cette commande:
mailx -s "Backup Serveur" $ADRESSE < $LOG
 
Mais je sais pas comment en shell faire pour additionner touts les echo dans le corp du mail avec la variable $LOG en fait avoir une copie du fichier log dans le corp du mail. Merci de votre aide

Reply

Marsh Posté le 14-09-2008 à 20:04:00    

$LOG est le nom du fichier qui contiendra les messages à envoyer par mail.

Code :
  1. echo "blabla" > $LOG
  2. echo "blabla2" >> $LOG
  3. ...
  4. mailx -s "Backup Serveur" $ADRESSE < $LOG


 

Reply

Marsh Posté le 14-09-2008 à 20:04:00   

Reply

Marsh Posté le 14-09-2008 à 20:23:34    

et si je veux genre
 

Code :
  1. LOG="/var/log/snapshot/snapshot-leopard.log"
  2. LOG_MAIL="/var/log/snapshot/tmp-snapshot-leopard.log"
  3. echo "blabla" >> $LOG AND $LOG_MAIL
  4. echo "blabla2" >> $LOG AND $LOG_MAIL
  5. ...
  6. mailx -s "Backup Serveur" $ADRESSE < $LOG_MAIL
  7. rm $LOG_MAIL


 
sa peut marcher ça? ou y a un autre mode?

Reply

Marsh Posté le 14-09-2008 à 20:37:41    

plus simple, tu fais :

Citation :

cp $LOG $LOG_MAIL


Pour info, ton opérateur "AND" peut être remplacé par la commande tee ( man tee pour plus d'info)
ex:

Citation :

echo "blabla"  | tee $LOG $LOG_MAIL


Message édité par jlighty le 14-09-2008 à 20:39:30
Reply

Marsh Posté le 14-09-2008 à 20:39:32    

non, je veux garder un historique dans $LOG donc si je fait ça je vais m'envoyer l'historique alors que sur $LOG_MAIL j'aurai que la dernier exécution. Merci

Reply

Marsh Posté le 14-09-2008 à 20:51:29    

hppp a écrit :

non, je veux garder un historique dans $LOG donc si je fait ça je vais m'envoyer l'historique alors que sur $LOG_MAIL j'aurai que la dernier exécution. Merci


alors un simple "cat $LOG_MAIL >> $LOG" suffira

Reply

Marsh Posté le 14-09-2008 à 21:00:00    

ouais mais c'est pas super propre, le tee me semble pas mal

Reply

Marsh Posté le 14-09-2008 à 21:06:32    

hppp a écrit :

ouais mais c'est pas super propre, le tee me semble pas mal


n'oublie pas l'option "-a" avec tee.
Cependant je préfère largement la 1er solution :

Code :
  1. echo "blabla " > $LOG_MAIL
  2. echo "blabla2" >> $LOG_MAIL
  3. #on archive les messages
  4. cat $LOG_MAIL >> $LOG

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed