PDA

Visualizza la versione completa : [bash] script backup


peppeocchi
14-04-2009, 16:22
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:

#!/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

peppeocchi
15-04-2009, 15:17
Nessuno ha una soluzione migliore?

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

mondobimbi
15-04-2009, 15:59
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

Gloglotto
15-04-2009, 16:17
io controllerei se la directory in cui stai andando a copiare esiste prima di crearci il tar

peppeocchi
16-04-2009, 15:31
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:


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):

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.

mondobimbi
16-04-2009, 16:17
#!/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.

mondobimbi
16-04-2009, 16:26
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 .

peppeocchi
16-04-2009, 17:13
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.

peppeocchi
16-04-2009, 17:16
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.

Loading