martedì 27 gennaio 2015

Quando un parametro speciale ti fa sentire meglio [bash]

Salve!

Come si dice, l'appetito vien mangiando. Vabbè, una cosa alla volta. Stasera, mentre scrivevo il mio "scriptino" quotidiano in bash, mi sono ritrovato di fronte ad una problematica apparentemente semplice. O forse era veramente semplice, ma sapete, sto invecchiando...

Comunque, immaginate di avere una variabile il cui valore sia costituito da tante stringhe, proprio come vi mostro nell'esempio sotto.

programmi="libreoffice vlc remmina liferea"

Bene, il discorso è questo, sto estrapolando da uno script lunghissimo, cerco di essere il più chiaro possibile, però.

In pratica voglio che lo script, ad un certo punto, controlli se nella variabile, di cui sopra, ci sia la stringa "libreoffice" e, solo se c'è, installi alcuni componenti aggiuntivi.

La domanda è la seguente: Come dobbiamo impostare il codice? Provate a dare una risposta senza leggere oltre.

Io ho fatto così:

programmi="libreoffice vlc remmina liferea"
echo "$programmi" | grep "libreoffice"
if [ $? -eq 0 ]; then
    apt-get install libreoffice-help-it libreoffice-l10n-it libreoffice-gtk -y
else
    echo "Niente da fare"
fi


La soluzione, in realtà, è veramente semplice, basta ricordarsi dell'esistenza del parametro speciale $?.

Cosa fa il $?

Restituisce lo stato dell’ultimo comando eseguito in foreground (primo piano).

Il risultato di $? può essere 0 o 1.

Restituisce 0 se è andato tutto bene, in caso contrario, restituisce 1.

Facciamo un esempio.

programmi="vlc remmina liferea"


Come potete vedere, ho eliminato la stringa "libreoffice" dalla variabile programmi. Il comando grep ovviamente non la trova e $? restituisce 1.



Se invece grep la trova, il $? restituisce 0, e dato che l'if confronta $? con lo 0, eseguirà il comando sperato.

Alla prossima!

3 commenti:

  1. Questa è una delle caratteristiche particolari della shell di Linux (e Unix prima): una volta che ci sei riuscito vedi quant'è semplice. Non ripeto la solita frase di DMR (cercatela sul blog).

    RispondiElimina
  2. Certo Juhan, hai proprio ragione... ;)

    RispondiElimina
  3. Un modo magari più veloce e che funziona anche con altre shell potrebbe essere:

    programmi="libreoffice vlc remmina liferea"
    trova="libreoffice"
    if [ -z "${programmi##*$trova*}" ] ;then
    apt-get install libreoffice-help-it libreoffice-l10n-it libreoffice-gtk -y
    else
    echo "Niente da fare"
    fi

    RispondiElimina