Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [bash] script backup

  1. #1

    [bash] script backup

    Ciao, mi sono avvicinato da poco alla programmazione bash, e volevo proporre la mia soluzione ad un esercizio. Volevo qualche dritta da qualcuno un po' più esperto per semplificare e migliorare il mio codice. Il testo dell'esercizio è questo:

    Creare uno script bash 'backup.sh' che effettui il backup giornaliero di una directory in un file .tar.gz. Tutti i backup andranno a finire in una cartella predefinita nello script ed ogni backup avrà un nome del tipo 'backupYYMMDD'.
    La sintassi dovrebbe essere la seguente:
    backup.sh [-d|--date YYMMDD] [directory to backup]

    La mia soluzione è questa:
    codice:
    #!/bin/bash 
    
    if [ $# -eq 3 ] || [ $1 = -h ] || [ $1 = --help ] ; then
      case "$1" in
        -h|--help)
          echo "Effettua il backup di una directory scelta dall'utente."
          echo "sintassi: `basename $0` [-d|--date YYMMDD] [directory to backup]"
          ;;
        -d|--date)
          if [ -d "$3" ]; then
    	cp -R "$3" /home/peppe/Documenti/Script/backup
    	cd /home/peppe/Documenti/Script/backup
    	DIR= `basename $3`
    	tar -czf "backup$2.tar.gz" `basename $DIR`
          else
    	echo "$3 non e' una directory e/o non esiste."
          fi
          ;;
        *)
          echo "Errore."
          echo "sintassi: `basename $0` [-d|--date YYMMDD] [directory to backup]"
          ;;
      esac
    else
      echo "Inserire la data di oggi e la cartella da backuppare."
      echo "sintassi: `basename $0` [-d|--date YYMMDD] [directory to backup]"
    fi
    
    exit 0

  2. #2
    Nessuno ha una soluzione migliore?

    Magari qualcuno può indirizzarmi su un forum specifico per la programmazione bash?

  3. #3
    ti dico solo un paio di cose perchè il tuo script non lo ho provato
    1 - per selezionare le opzioni esiste il comando getopts che è un eccellente analizzatore della linea di comando, usarlo ti semplifica lo script rendendolo più chiaro.
    2 - esiste una variabile di ambiente $HOME che corrisponde alla tua home, usala scrivendo
    $(HOME)/Documenti/Script/backup al posto di /home/peppe/Documenti/Script/backup .

    se vede qualcos'altro te lo dico
    ciao
    sergio

  4. #4
    io controllerei se la directory in cui stai andando a copiare esiste prima di crearci il tar

  5. #5
    Vi ringrazio per le risposte.

    @Gloglotto
    hai ragione, devo implementare questo ed altri controlli...una volta completato lo script, avevo intenzione di trasformarlo da semplice backup (che cioè crea una copia per tutti i file), a backup incrementale, cioè creo degli hard link ai file per evitare di fare copie dello stesso file (se non modificato, ovviamente), ma non so se questo è possibile con un archivio tar.gz, o se è possibile solo con cartelle e file non raggruppati e compressi.

    @sergio
    alle variabili d'ambiente c'ho pensato solo dopo aver postato il codice, e comunque devo dare un'occhiata a tutte le variabili per capire se posso sfruttarne altre oltre a $HOME.
    non conoscevo il getopts, ma in ogni caso devo usare il case per poi controllarle. Il vantaggio potrebbe essere nel momento in cui si attiva l'opzione -d che ha anche un argomento, e quindi il controllo dovrebbe essere sul $2 se -d è $1, però se messo dopo altre opzioni potrebbe essere un po' incasinato...però potrei ovviare al problema shiftando i parametri in base a quelli incontrati. Forse non sono stato chiaro, ma potrebbe essere una cosa del genere:

    codice:
    case $1 in
      -d) comandi
           shift ; shift
      -opt) altre opzioni
    Non c'è dubbio però che con getopts verrebbe una cosa più pulita...anche se non ho capito ancosa come funziona. Cioè, la sintassi è questa (ad esempio con un ciclo while):
    codice:
    while getopts ":abcde:fg" Opzione
    e questo mi indica che l'ozione -e ha anche un argomento...ma se avessi più opzioni che hanno un argomento? (ho letto che si mettono i : dopo l'opzione con argomento)
    La fonte di getopts sulla quale mi sono consultato è questa: http://www.pluto.it/files/ildp/guide/abs/internal.html

    Grazie ancora.

  6. #6
    codice:
    #!/bin/bash
    
    while getopts  "ab:c" option
    do
      echo $option $OPTIND $OPTARG
    done
    vuol dire che lo script può avere tre opzioni di cui l'opzione -b deve avere un argomento. L'argomento lo ritrovi nella variabile ambiente $OPTARG mentre $OPTIND è l'indice del prossimo argomento soggetto al parser.

    Provo lo script con
    $./prova_getopts -ab "ciao mondo" -c
    $./prova_getopts -a -b "ciao mondo" -c
    $./prova_getopts -a -b "ciao mondo" -c -d

    l'ultimo ti darà un errore dato che l'opzione d non è prevista.

  7. #7
    dimenticavo di aggiungerti altri esempi significativi

    $./prova_getopts -b "ciao mondo" -c -a
    $./prova_getopts -b mondo -ca

    come vedi un vantaggio non indifferente è che le opzioni (come è normale) possono essere inserite nell'ordine che si vuole ed eventualmente raggruppate (-ca ).

    C'è una versione anche in C che si chiama getopt .

  8. #8
    E se volessi far prendere argomenti a più di una opzione?
    esempio:
    ./script.sh -d data -h ora -r directory -c -z
    dove "d h r" prendono argomenti, e "c z" non ne prendono.

  9. #9
    Ok, scusami, ho capito solo adesso. Avevo capito male...quindi dopo ogni opzione alla quale voglio far prendere un argomento metto i ":". Grazie mille. Adesso in un altro script ho un problema diverso, ma apro un altro topic. Grazie ancora,
    Peppe.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.