Introduzione a Unix
Indietro | Capitolo 9 Programmazione di shell | Avanti

# 9.8 Funzioni

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.

Indietro | Partenza | Avanti
Input interattivo | Risali | Comandi di controllo

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>.