giovedì 4 dicembre 2014

Controllo del flusso in Shell Programming

Nel post di oggi parleremo di nuovo di Shell Programming. Negli scorsi episodi abbiamo imparato un po’ di aritmetica della bash e abbiamo anche capito che cosa sono le Wild Cards.
In questo episodio, invece ci occuperemo di controllare il flusso di esecuzione del codice e delle operazioni sui file.

  



     

COSA SONO I CONTROLLORI DI FLUSSO
Sono tutte quelle strutture che permettono di deviare il normale percorso di esecuzione, esattamente come l’acqua nei tubi è deviata dal suo percorso da vari elementi come i rubinetti e i .
Questi costrutti sono tre:

  • if e if then else
  • while 
  • for
Incominciamo quindi subito con il primo controllore di flusso.
 
 
IF E IF THEN ELSE
L’if è il costrutto che permette le decisioni binarie. Provvede alla scelta confrontando due o più variabili. La sua sintassi è:


if [ <var1> <condizione> <var2> ]; then
    /*codice da eseguire se a condizione è vera*/
else
    /*Codice da eseguire se la condizione è falsa*/
fi


Ora, la sintassi non è difficile. Si deve solo prestare attenzione agli spazi.
Incominciamo dall’inizio. <var1> e <var2> (ah, ovviamente senza diamanti<>) sono le variabili da confrontare.

Il costrutto <condizione> è, in parole povere il modo di confrontare le due variabili. Sono delle sigle che fanno per lo più operazioni logiche. Vediamo le principali:
  • -gt : maggiore. 
  • -lt : minore. 
  • -ge : maggiore o uguale.
  • -le : minore uguale.
  • -eq : uguale.
  • -ne : diverso.
Applicate in modo opportuno permettono di decidere quale ramo, se quello del vero o quello del falso, eseguire.
Ovviamente vi è la possibilità di concatenare varie di queste espressioni grazie a:

  • || : or logico. 
  • && : and logico.
Esempio:
eta=20;
if[ $eta -ge 18 ]; then
    echo “Hai più di 18 anni, puoi entrare”
else
    echo “Non hai l’età per entrare”
fi

Ovviamente se non abbiamo bisogno del ramo false, terminiamo il ramo true con il costrutto fi.


WHILE
Il while è il responsabile del ciclo. Permette, finchè la condizione è vera, di eseguire il codice all’interno del suo ramo. La sintassi è:

while [ <var1> <condizione> <var2> ];
do
    /*Codice da eseguire se la condizione è vera*/
done


Al posto di <condizione> possiamo inserire una delle condizioni logiche che abbiamo incontrato in precedenza.


FOR
La sintassi del for è:


for <variabile> in <range>
do
    /*Codice da eseguire*/
done


Questo costrutto è analogo al while, nel senso che permette di eseguire il codice all’interno del suo ramo per tutte le volte specificare nel suo <range>:

Esempio:


for file in /home/utente/Documenti/*
do
    echo $file
done



ATTENZIONE
Partiamo con il dire che nello Shell Scripting le variabili non hanno tipo, ossia la Bash, per esempio, somma numeri con numeri e numeri con caratteri, con il conseguente problema di dati non corretti. Sta quindi a noi il compito di inserire le giuste variabili nelle giuste operazioni.
In ogni caso possiamo distinguere due tipi di variabili:

  1. Quelle che contengono numeri; 
  2. Quelle che contengono caratteri;
Per le prime ci affidiamo alle regole viste prima.
Per le seconde valgono i simboli matematici:

  • > : maggiore. 
  • < : minore.
  • >= : maggiore o uguale.
  • <= : minore uguale.
  • == : uguale.
  • != : diverso.

LEGGERE L’INPUT DA TASTIERA

Per leggere l’input da tastiera si usa semplicemente il costrutto:

read <variabile>

Dove <variabile> conterrà l’input  letto da tastiera fino all’inserimento di un invio.


LAVORARE CON I FILE

Un grande utilizzo degli script è quello di analizzare sistematicamente grandi moli di file. Sfruttando pesantemente ciò che abbiamo detto in precedenza, possiamo fare contenere qualunque cosa alle nostre variabili. Compresi i file. Valgono le seguenti regole:


  • -f file : true se il file esiste; 
  • -s file : true se il file non è vuoto;
  • -r file : true se il file è leggibile;
  • -w file : true se il file è scrivibile;
  • -x file : true se il file è eseguibile;
  • -d file : true se il file è una direcory;
  • -h file : true se il file è un link simbolico;
Esempio:

for file in /home/utente/*
do
    echo $file
    if [ -r $file ]; then
        echo "Si hanno i permessi di lettura."
    fi


    if [ -w $file ]; then
        echo "Si hanno i permessi di scrittura."
    fi

    if [ -d $file ]; then
        echo "E' una directory."
    fi
done

 


VARIABILI BUILD-IN
Sono delle variabili che sono proprie dello script che stiamo eseguendo. Sono molteplici. Le principali sono:

  • $* : Si riferisce a tutti gli argomenti da linea di comando del nostro script. Può dare problemi con gli spazi. 
  • $@ : Analoga alla precedente ma gestisce correttamente gli spazi.
  • $# : Contiene il numero di argomenti da linea di comando dello script.

CONCLUSIONE
Abbiamo visto molte cose oggi. Non ci resta che provarle una a una.
Suggerimento: sfruttate le whild card!
Fateci sapere i risultati. A prossimo post ;)


Link alle puntate precedenti:
- Introduzione alla Shell Bash - Episodio 1
- Variabili e aritmetica della Bash - Episodio 2
- Wild Card. Cosa sono e come si usano - Episodio 3
 


Fonti:
- Immagini di +Joel Garia;

Nessun commento:

Posta un commento