Shell Scripting - Cicli e argomenti a riga di comando

Tempo di lettura: 7 minuti

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.

Cicli

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.

Parametri a riga di comando

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

Input interattivo

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:

  • read -p legge da terminale e salva la variabile in rx;
  • Nel caso la risposta sia negativa, stampa il nome dell’utente ed esce;
  • Nel caso sia positiva, chiede la password senza visualizzarla a schermo (con l’opzione -s) e poi la stampa sia in chiaro, sia con l‘hash SHA-1 (awk sarà introdotto in un prossimo articolo);
  • Dopo averla inserita, aspetta 2 secondi (con l**‘opzione _-t 2_**) per l’inserimento di un altra chiave. Se viene inserita stampa _Bentornato_, altrimenti stamperà _Nessuna chiave presente_ ed infine esce.

Conclusioni

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.