Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Avanti |
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.