Continuiamo con la nostra guida allo shell scripting introducendo i cicli, l’inserimenti di stringhe a linea di comando e la creazione di script interattivi.
Come detto nello scorso articolo, è possibile scrivere ogni tipo di ciclo, molto simili a quelli presenti in ogni linguaggio di programmazione.
Oltre al for each utilizzato come esempio, esiste anche il for iterativo, utilizzabile per iterare array o variabili. Viene definito come
for (( variabile=intero ; condizione ; iterazione ))
Non ci sono differenze con il for each, ma sta al programmatore decidere quale è più utile, in base ai casi che si presentano.
Stampa dei numeri pari fino a 100
#!/bin/bash
for (( i=2; i<100; i++ ))
do
if [ $((i % 2)) -eq 0 ]
then
echo $i
fi
done
Con il while le operazioni sono molto simili, semplicemente il programma esce quando raggiunge la condizione definita nel while.
while condizione
do
operazioni_da_eseguire
done
Uno dei comandi che ho sempre trovato comodi sono il break e il continue. Chiaramente il primo ferma il ciclo, mentre il secondo lo fa continuare. Nel caso siano presenti più cicli innestati (uno dentro l’altro) è possibile aggiungere il numero del ciclo che si vuole stoppare (o continuare).
Ad esempio,
#!/bin/bash
for (( i=2; i<100; i++ ))
do
if [ $((i% 2)) -eq 0 ]
then
for (( j=2; j<10; j++ ))
do
echo $(( i*j ))
if [ $(( i*j )) -gt 200 ]
then
break 2
fi
done
fi
done
Questo script è un continuo di quello precedente, ma viene aggiunto un altro for con cui si moltiplica la variabile i. Nel caso la moltiplicazione superi 200, viene stoppato tutto lo script a causa del break 2.
Passare parametri a linea di comando significa semplicemente definire le variabili prima dell’esecuzione dello script, direttamente nel terminale. Un semplice esempio possono essere i comandi che passiamo quando eseguiamo un programma dal terminale, come le opzioni di nmap o nikto.
Stampa delle opzioni possibili
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
-h) echo -e "Opzioni possibili:\n-a\n-b\n-c";;
-a) echo "Opzione -a";;
-b) echo "Opzione -b";;
-c) echo "Opzione -c";;
*) echo "$1 non è un opzione possibile";;
esac
shift
done
In questo script l’argomento via terminale viene salvato nella variabile $1 e tramite il case vengono effettuate le varie scelte. La particolarità è lo shift, il quale permette di leggere le variabili dalla prima all’ultima. L’opzione -e nell'echo è stata inserita per permettere l’utilizzo dei caratteri per andare a capo **(_n_**).
Nel caso volessi passare dei parametri alle opzioni, basterà salvare la variabile $2 ed eseguire lo shift di due posizioni.
Nel caso voleste scrivere uno script e pubblicarlo, ricordo che i programmi Linux seguono (o dovrebbero seguire..) delle linee guida per i comandi via terminale. I più comuni sono nella tabella
Sebbene l’inserimento di stringhe a linea di comando sia la scelta più comune, è possibile scrivere script interattivi, salvando stringhe durante l’esecuzione dello stesso.
Il comando principali è read, con il quale si possono salvare stringhe ed utilizzarle all’interno dello script.
Inserimento di nome, password e chiave d’accesso
#!/bin/bash
echo -n "Inserisci username: "
read user
read -p "Vuoi continuare [Y|N]?" rx
echo
case $rx in
Y | y)echo "Ciao $user"
read -s -p "Inserisci password:" pass
echo
echo "La tua password è $pass"
echo $pass | sha1sum | awk '{print $1}'
echo
if read -t 2 -p "Inserisci chiave d'accesso: " key
then
echo
echo "Bentornato"
else
echo -e "\nNessuna chiave presente\n"
echo "Ciao ciao"
fi;;
N | n)echo
echo Ciao $user;;
*) echo "Scelta errata. Riprova"
exit;;
esac
In questo esempio le funzionalità introdotte sono:
Nei prossimi articoli passeremo ad argomenti già più avanzati, interagendo con i processi, utilizzeremo funzioni bash e introdurremo anche sed e awk. A chi non fosse chiaro qualcosa, consiglio di legger questa guida, divisa per argomenti e di ottima comprensione.