La shell Bourne permette di definire funzioni. Queste sono molto simili agli alias della shell C, ma permettono più flessibilità. Una funzione ha la forma:
funzione () {
comando; }
dove lo spazio dopo { e il punto e virgola (;) sono obbligatori;
il punto e virgola può essere omesso facendo precedere a } un
newline. Spazi e newline aggiuntivi sono permessi.
Alcuni esempi di funzioni possono essere visti nel semplice file
.profile
discusso nei primi capitoli, dove si avevano
delle funzioni per ls
e ll
:
ls() { /bin/ls -sbF "$@";}
ll() { ls -al "$@";}
La prima funzione ridefinisce ls(1) affinchè le opzioni
-sbF
siano sempre fornite dal comando standard
/bin/ls
e in modo da agire in base all'input fornito,
$@
. La seconda di queste funzioni prende il valore
corrente di ls
(la funzione precedente) e aggiunge le
opzioni -al
.
Le funzioni sono molto utili negli script di shell. Il seguente script è una versione semplificata di uno script utilizzato per effettuare automaticamente il backup su nastro delle partizioni di sistema.
#!/bin/sh # Script cron per un completo backup del sistema HOST=`/bin/uname -n` admin=frank Mt=/bin/mt Dump=/usr/sbin/ufsdump Mail=/bin/mailx device=/dev/rmt/0n Rewind="$Mt -f $device rewind" Offline="$Mt -f $device rewoffl" # Failure - exit failure () { $Mail -s "Backup fallito - $HOST" $admin << EOF_failure $HOST Script cron backup fallito. A quanto pare non c'è il nastro nel dispositivo. EOF_failure exit 1 } # Dump failure - exit dumpfail () { $Mail -s "Backup fallito - $HOST" $admin << EOF_dumpfail $HOST Script cron backup fallito. A quanto pare non c'è il nastro nel dispositivo. EOF_dumpfail exit 1 } # Success success () { $Mail -s "Backup completato con successo - $HOST" $admin << EOF_success $HOST Script cron backup apparentemente riuscito. Il file /etc/dumpdates è: `/bin/cat /etc/dumpdates` EOF_success } # Conferma nastro nel device $Rewind || failure $Dump 0uf $device / || dumpfail $Dump 0uf $device /usr || dumpfail $Dump 0uf $device /home || dumpfail $Dump 0uf $device /var || dumpfail ($Dump 0uf $device /var/spool/mail || dumpfail) && success $Offline
Questo script illustra alcuni argomenti che sono stati trattati in
questo documento. Lo script inizia settando i valori di alcuni parametri.
HOST
viene inizializzato dall'output di un comando,
admin
è l'amministratore di sistema,
Mt
, Dump
e Mail
sono nomi di programmi, device
è il dispositivo
speciale usato per accedere al nastro, Rewind
e
Offline
contengono i comandi rispettivamente per
riavvolgere e scaricare il nastro usando il riferimento
Mt
e le necessarie opzioni. Vengono definite
tre funzioni: failure
, dumpfail
e
success
. Tutte le funzioni in questo script utilizzano
la forma here document per realizzare il contenuto
della funzione stessa. Si introducono ora gli operatori logici
OR (||) e
AND (&&); ciascuno è
posizionato tra una coppia di comandi. Per l'operatore
OR, il secondo comando viene eseguito solamente se
il primo comando non è stato completato con successo. Per
l'operatore AND, il secondo comando viene
eseguito solamente se il primo comando è stato completato con
successo.
Lo scopo principale dello script è realizzare i comandi
Dump
, ad esempio copiando i file system specificati.
Prima si tenta di eseguire il riavvolgimento del nastro. Se questo
fallisce, || failure
, si esegue la funzione
failure
e si esce dal programma. Se invece questo ha
successo si procede con il backup a turno di ogni partizione, ogni volta
verificando che questa operazione sia completamente riuscita
(|| dumpfail
). Se questa operazione non viene eseguita
completamente con successo si esegue la procedura
dumpfail
e si esce. Se l'ultimo backup ha successo si
procede con la funzione success
((...) &&
success
). In fine si riavvolge il nastro e lo si manda fuori
linea affinchè altri utenti non possano accidentalmente scriverci
sopra.
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.