Mini guida per BASH – parte 3 –

Memorizzare comandi utili

A volte abbiamo bisogno di creare degli script che sono in realtà una sequenza di utility da eseguire. In realtà su diversi sistemi linux potremmo trovare la stessa utilità in posizioni diverse. In questo caso torna utile immagazzinare il percorso dell’eseguibile all’interno di una variabile che in caso di  cambiamento  sarà facilmente aggiornabile,  la variabile verrà in seguito interpolata nella composizione di un comando.

#/bin/bash
LSCMD = /bin/ls
DIR = /root
$LSCMD $DIR

Quali variabili sono valorizzate nel mio sistema ?

Usiamo il comando set ed il comando export –p

Quando realizziamo uno script, come facciamo ad ottenere i valori dei relativi parametri inseriti in input ?

Nella realizzazione di script bash è uso comune realizzare l’input direttamente di parametri in fase di esecuzione, esempio : mioscript parametro1 parametro2. Per poter conoscere il valore di questi parametri faremo riferimento alle variabili ${1} e ${2} fino all’n-esimo che sarà appunto ${n}. N.B.: Per identificare ogni variabile usiamo le parentesi graffe, perché nel caso dovessimo richiamare il 10-imo elemento con il metodo $10 in realtà avremmo il valore della variabile $1 seguita dal carattere zero (0).

#/bin/bash
# nome script : provaparametri.sh
echo ${1}
echo ${2}

esecuzione : provaparametri  hello world

Se avessimo l’intenzione di riferirci a tutti i parametri inseriti in input useremo, invece, la variabile $.

#/bin/bash
# nome script : provaelenco.sh
for ELENCO in $

do
    echo “il file si chiama $ELENCO”
done

esecuzione : provaelenco *.txt

A questo punto sorge un problema, se i parametri dati in input (ad esempio un elenco di 3 file) dovessero essere presenti dei parametri contenenti degli spazi (nome file.doc) lo script fallirebbe in quanto nella esecuzione del loop  verrebbero identificati 4 parametri. La soluzione è usare la variabile $@ racchiusa fra doppi apici , quindi “$@” sarà il vero identificativo di ogni parametro. Il nostro script diventa dunque :

#/bin/bash
# nome script : provaelenco2.sh
for ELENCO in “$@”
do
    echo “il file si chiama $ELENCO”
done

esecuzione : provaelenco *.txt

Controllare i parametri in input ed il loro numero

Se volessimo sapere quanti parametri sono stati dati in input, perché magari c’interessa che il nostro script ne riceva almeno uno,  potremmo usare la variabile ${#} all’interno di un costrutto if

#/bin/bash
#nome script : quantiparametri.sh
if  (( $# < 1 ))
then
    printf “%b” “Errore pochi parametri\n”
    printf “%b” “Inserire almeno un parametro\n”
    exit 1
else
    printf “%b” “Bravo numero giusto “
fi

In questo modo obbligheremo chi usa il nostro script ad inserire almeno un parametro (notate \n  vuol dire vai a capo). A questo punto stiamo pensando tutti ai comandi già analizzati dove si dava come parametro un valore preceduto da una opzione come ad esempio ls –F, dove -F è una opzione e non è un parametro, questo vuol dire che quando conrolleremo se è stato inserito almeno un parametro la variabile $# dovrà avere almeno valore 2. A questo punto però vogliamo anche essere sicuri che in presenza di più parametri, il nostro script legga sempre e solo il loro valore. Introduciamo il comando shift, il quale sposta il cursore sulla stringa successiva; rielaboriamo il nostro script :
 
#/bin/bash
#nome script : quantiparametri.sh
if  (( $# < 2 ))
then
    printf “%b” “Errore pochi parametri\n”
    printf “%b” “Inserire almeno una opzione ed un parametro\n”
    exit 1
elif  [[ $1 = -p ]]
    then
        shift
        printf “%b” “Hai selezionato l’opzione –p\n “
        printf “%b” “Hai inserito il parametro : $1 “
        exit 0
else
        printf “%b” “Devi selezionare una opzione\n “
printf “%b” “Opzioni disponibili : -p “
exit 1
fi

Controllare i parametri di default

La shell ci mette a disposizione altri tre operatori :- e := oltre a 😕 grazie ad essi potremo assicurarci che ogni variabile abbia il giusto valore

    :-  assegna un valore ad una variabile se non inizializzata
    := assegna sempre un valore anche se la variabile è già inizializzata
    😕 rilascia un messaggio di errore se un parametro non è impostato

Testare l’esistenza di un file o di una directory, e non solo….

Nel caso dovessimo avere la necessità di conoscere gli attributi di file e directory, così da rendere il nostro script robusto nella sua esecuzione, potremo usare degli operatori unari che effettuano diversi tipi di controlli, notevole come ci siano diversi tipi di operatori che soddisfano le più svariate esigenze, il loro uso è < operatore >  < file >. Ad esempio :
DIRECTORY = /tmp
ILFILE = Desktop/prova
ALTROFILE = Desktop/prova.bk
if [ -d “$DIRECTORY” ]    //se $DIRECTORY è una directory
then
    if [ -e “$ILFILE” ]    //se esiste il file
    …….
else
fi

di seguito vi elenco i controlli che potrete effettuare grazie agli operatori :

-b     il file é un dispositivo a blocchi (come un hard disk, cdrom, floppy)
-c     il file è un dispostivo a cartteri (tastiera, modem, scheda audio, ecc.)
-d     il file è una directory
-e     il file esiste
-f      il file è un file regolare (non una directory non un dispositivo a blocchi)
-g     il file
-h     il file un link simbolico
-N    se il file è stato modificato dalla sua ultima lettura
-O    se si è il proprietario di un file
-p     il file è una pipe
-r      il file ha I permessi di lettura per l’utente che li prova
-s     il file è più grande di 0
-S     il file è un socket
-u     testa se il bit Set UID del file è stato impostato
-w     il file è scrivibile per l’utente che li prova
-x     il file è eseguibile per l’utente che li prova

Inoltre nel confronto fra due file possiamo :
    file1 –nt file2        //il file 1 è più nuovo di file2
    file1 –ot file2        //il file 1 è più vecchio di file 2
    file2 –et file         //il file 1 è lo stesso che il file2

Operatori logici

-a = AND
-o = OR

if [ -r $FILE -a -w $FILE ] //se il file è leggibile AND se è scrivibile

Operatori di confronto

La shell ci offre diversi operatori di confronto per poter eseguire confronti fra numeri e altri per poter eseuire confronti fra stringhe, ecco un elenco :

Confronto fra numeri         Confronto fra stringhe        Significato
    -lt                                                     <                           più piccolo di
    -le                                                    <=                         più piccolo di o uguale a
    -gt                                                    >                           più grande di
    -ge                                                   >=                         più grande di o uguale a
    -eq                                                   =, ==                     Uguale a
    -ne                                                   !=                          diverso da