sabato 2 gennaio 2010

bash scripting - if e test (p2)

Bene oggi vediamo come creare degli script più utili inserendo delle condizioni (o selezioni): il costrutto if.
In pratica if ci permette di eseguire un'azione o un'altra a seconda del verificarsi di una certa condizione. Ovviamente le azioni possono essere sia singole istruzioni che sequenze di istruzioni.

Vediamo meglio cosa significa con un po di buon pseudo-codice:

if condizione
then
    azione1
else
    azione2
fi

  • if ovviamente identifica il fatto che stiamo ponendo una condizione, mentre fi identifica il fatto che il costrutto if è terminato e lo script può continuare con quello che viene dopo.
  • condizione è una clausola che può assumere soltanto un valore booleano, ovvero può essere solo vera o falsa! Ad esempio se una variabile o l'output di un certo comando è uguale ad un valore specifico.
  • then identifica la parte di codice che verrà eseguita nel caso che condizione sia vera. Nell'esempio è azione1.
  • else invece identifica la parte di codice che viene eseguita nel caso condizione si verifichi falsa. Nell'esempio è azione2.
Dopo un poco di teoria vediamo un poco di pratica con un semplice script che dice se il numero inserito dall'utente e' positivo o no.
(ok, non è proprio un script utilissimo, ma serve come esempio)

#! /bin/bash

# chiede il numero all'utente e lo legge
echo "Inserisci numero"
read numero

# controlla se il numero e' maggiore di 0
if test $numero -gt 0
then
    echo "il numero $numero e' positivo"
else
    echo "il numero $numero non e' positivo"
fi

exit 0


La cosa che si nota subito è il fatto che con if viene usato anche il comando test.
test è un comando da terminale che viene usato per eseguire delle comparazioni tra variabili che possono essere: stringhe, interi o file.
La sintassi di test è abbastanza semplice, anche se ci sono un po di opzioni da ricordare.
La sintassi è: Valore opzione Valore
Dove valore può essere come detto prima una stringa, intero o file. (ovviamente devono essere entrambi dello stesso tipo)
Mentre opzione identifica il confronto da eseguire:
  • per stringhe: uguale (=) o diverso (!=)
  • per interi: uguale (-eq) maggiore o uguale (-ge) maggiore (-gt) minore o uguale (-le) minore (-lt) diverso (-ne)
  • per file: stesso device o inode number (-ef) più nuovo (-nt) più vecchi (-ot)
Per informazioni più dettagliate aprite un terminale e digitate man test

2 commenti:

  1. Si sarebbe potuto scrivere anche

    if [ $numero -gt 0 ]

    ovvero utilizzando le parentesi quadre invece del comando test

    RispondiElimina
  2. si vero si può fare anche in questo modo!
    Grazie per la precisazione

    RispondiElimina