Appendice M. Esercizi

Sommario
M.1. Analisi di script
M.2. Scrivere script

M.1. Analisi di script

Si esamini lo script seguente. Lo si esegua e, quindi, si spieghi quello che fa. Si commenti lo script e lo si riscriva in modo che risulti più compatto ed elegante.

#!/bin/bash

MAX=10000


  for((nr=1; nr<$MAX; nr++))
  do

    let "t1 = nr % 5"
    if [ "$t1" -ne 3 ]
    then
      continue
    fi

    let "t2 = nr % 7"
    if [ "$t2" -ne 4 ]
    then
      continue
    fi

    let "t3 = nr % 9"
    if [ "$t3" -ne 5 ]
    then
      continue
    fi

  break   # Cosa succede se si commenta questa riga? E perché?

  done

  echo "Numero = $nr"


exit 0

---

Spiegate il compito svolto dallo script seguente. In fondo corrisponde semplicemente ad una pipe da riga di comando contenente delle variabili.

#!/bin/bash

NOMEDIR=/usr/bin
TIPOFILE="shell script"
FILE_DI_LOG=logfile

file "$NOMEDIR"/* | fgrep "$TIPOFILE" | tee $FILE_DI_LOG | wc -l

exit 0

---

Un lettore ha inviato il seguente frammento di codice.

while read RIGA
do
  echo $RIGA
done < `tail -f /var/log/messages`

Il suo desiderio era quello di scrivere uno script che visualizzasse le modifiche del file di log di sistema /var/log/messages. Sfortunatamente, il precedente codice si blocca e non fa niente di utile. Perché? Si risolva il problema in modo che funzioni correttamente (Suggerimento: invece di redirigere lo stdin del ciclo, si provi con una pipe.)

---

Analizzate il seguente script di "una-sola-riga" (qui posto su due righe per maggior chiarezza) fornito da Rory Winston:

export SUM=0; for f in $(find src -name "*.java");
do export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }'))); done; echo $SUM

Suggerimento: innanzitutto , si suddivida lo script in sezioni di dimensioni minori. Quindi, si esamini attentamente l'uso dell'aritmetica nelle parentesi-doppie, i comandi export, find, wc e awk.

---

Si analizzi l'Esempio A-10 e lo si riorganizzi in uno stile più semplice e logico. Si veda quante delle variabili in esso presenti possono essere eliminate e lo si ottimizzi per aumentarne la velocità d'esecuzione.

Si modifichi lo script in modo che accetti, come input, un qualsiasi file di testo ASCII per la sua "generazione" iniziale. Lo script dovrà leggere i primi caratteri $ROW*$COL ed impostare le occorrenze delle vocali come celle "vive". Suggerimento: ci si accerti di aver trasformato tutti gli spazi presenti nel file di input in caratteri di sottolineatura.