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