Progetto Bash. I Cicli: FOR – Pratica

Benvenuti ad un nuovo capitolo del Progetto Bash. Se avete letto l’articolo teorico del ciclo FOR ( FORever ;) )del caro Bit3Lux, sicuramente non avrete nessun problema ad affrontare un po’ di parte pratica.

Ovviamente do per scontato che sappiate cosa faccia un ciclo FOR. Vediamo un po’…mhm..poche mani alzate e sguardi persi nel vuoto. Beh non vi preoccupate con questo post saprete manipolare il ciclo FOR ad occhi chiusi cantando una canzone di Gigi D’alessio..ehm scusate senza Gigi.

Il ciclo For ci da sempre una mano! Per esempio, se volessimo aggiungere un’estensione .bak a tutti i file .xml, basta fare così:

$ for i in *.xml; do mv $i $i.bak; done

la variabile $i equivale ad ogni nomefile.xml. Ogni volta che cicla sposta il file da nomefile.xml a nomefile.xml.bak. FOR terminerà il suo ciclo solo dopo aver passato in rassegna tutti i file.xml

Ma questo è solo un piccolo esempio di come si potrebbe utilizzare il ciclo FOR. Mettiamo il caso di dover estrarre 20 file .deb e metterli all’interno di una directory. Tramite il comando dpkg –extract possiamo tranquillamente fare questa operazione..ma..dpkg –extract supporta solo un file alla volta. Quindi significherebbe che dovremmo dare per 20 volte il comando dpkg –extract, una bella rogna, non trovate? Per questo ci viene incontro, ancora una volta, il ciclo FOR:

$ for i in *.deb; do dpkg --extract $i nome_directory; done

Ogni file con estensione .deb verrà estratto all’interno della directory che noi abbiamo dato.

Il ciclo FOR accetta anche  i parametri speciali $@ e $* (ve li ricordate?) Ecco qui uno script che mostra la loro differenza:

#!/bin/bash

for i in "$*"
do
    echo "Ecco qui con \$* -> $i"
done

echo ""

for i in "$@"
do
    echo "Ecco qui con \$@ -> $i"
done

#Capita la differenza?

Se salvate lo script e poi lo eseguite:

$ ./differenza.sh

vedrete la differenza. In un ciclo FOR è possibile utilizzare anche la sostituzione di comando per svariate idee. Per esempio, se volessimo controllare quanti script eseguibili ci sono  all’interno della directory /sbin?, dovremmo fare così:

$ for i in $(ls /sbin) do; file /sbin/$i | grep ASCII; done

La variabile $i contiene una lista di file della cartella /sbin. Viene eseguito il comando file per capire il tipo di contenuto, se si tratta di testo puro o di script eseguibile. Altra particolarità del ciclo FOR sta nella possibilità di inserire più campi diversi. Supponiamo di avere quattro coppie di Nome e Cognome e di volerli mettere in due variabili diverse:

#!/bin/bash

for i in "Pippo Carota" "Carlo Cipolla" "Luca Peperone" "Angelo Caciotta"
do
set -- $i
echo -e "Nome: $1 \nCognome: $2 \n"
done

In questo script possiamo notare come la variabile $i ha 4 elementi  e ogni elemento è composto da due parole. Ad ogni ciclo il contenuto della variabile $i verrà scomposto in parametri posizionali tramite il comando set. Il sta ad indicare che se un elemento inizia con il segno - oppure è nullo, non provochi un errore. Una volta scomposto il contenuto della variabile $1 in parametri posizionali, manipolare il Nome aka $1 e Cognome aka $2 sarà un gioco da ragazzi.

Ma vediamo di realizzare uno script che permette di creare un elenco degli utenti di sistema:

#!/bin/bash

j=0

for i in $(cat /etc/passwd | cut -d ":" -f 1)
do
echo "Nr. $j - $i"
j=$((++j))
done

Salvate lo script e poi lo eseguite:

$ ./stampa_utenti.sh

In questo script andremo a selezionare solo la prima colonna del file /etc/passwd e ad ogni ciclo stamperemo il nome dell’utente accompagnato da un numero.

Il ciclo FOR può essere anche scritto nella stessa sintassi del linguaggio C.

for (i=1; i<= VALORE; i++)
{
...comandi...
}

Ecco un piccolo esempio:

#!/bin/bash

LIMITE=10

for ((i=1; i<= LIMITE; i++))
do
echo "Mi piace contare: $i"
done

Questa sintassi, leggermente diversa dalle precedenti, introduce tre controlli. Il primo, i=1, crea una variabile con valore 1. Questo controllo non verrà più toccato. Il secondo controllo i<= LIMITE, controlla che la variabile $i sia minore o uguale al valore di $LIMITE., in questo caso 10. Il terzo ed ultimo controllo è i++. Questo in pratica ad ogni ciclo aumenta il valore di $i di 1. Questo ciclo verrà ripetuto 10 volte.

Possiamo anche impostare più di una variabile all’interno del ciclo FOR con stile C. Ecco un piccolissimo esempio:

#!/bin/bash

LIMITE=10

for ((a=1, b=1; a <= LIMITE; a++, b++))  # La virgola concatena le operazioni.
do
echo -n "$a-$b "
done

echo; echo

exit 0

E con questo ultimo esempio chiudo qui il post sul ciclo FOR e spero che vi esercitiate abbastanza :).

Ci becchiamo al prossimo post.

Io & Bit3Lux

2 thoughts on “Progetto Bash. I Cicli: FOR – Pratica

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>