Opzioni da linea di comando con getopts

Nei miei script di studio, per il passaggio di dati agli script, fino ad ora, ho utilizzato i parametri posizionali ($1, $2,…${N}); è ora di imparare ad usare degli indici letterali come negli script “seri” del tipo:

nomescript -a parametro -b altro Parametro.

Per fare quello che voglio, ho trovato due possibili comandi: “getopts” e “getopt”; il primo, a differenza del secondo, non ammette l’uso di “stringhe opzione lunghe” (–opzione) ma solo ad un carattere (-a), ma ha il vantaggio di essere un “builtin” quindi presente di default in Bash; per questo motivo parlerò di “getopts”.

Ho fatto un piccolo script per le prove (più in basso) e mi segnerò su questa pagina qualche annotazione utile sull’uso del comando.

USO di base

Per prima cosa vanno decise le lettere da usare come opzioni letterali nel mio caso ‘a, b, c, d, e, h’ nell’utilizzo sulla linea di comando devono essere precedute dal “-” (meno) ed inserite singolarmente (non: ‘script -abc’ ma ‘script -a -b -c’ ).

Per l’utilizzo pratico conviene inserirle in un ciclo while con case, vedere lo script ed i commenti:

#!/bin/bash
clear script=$(basename $0)
help=”Questo script, ‘$script’, serve solo per vedere l’uso di getopts quindi affinché venga eseguito correttamente occorre passare almeno un’opzione. Le opzioni accettate sono: ‘-a’, ‘-b’, ‘-c’, ‘-d’, ‘-e’ e ‘-h’
Le opzioni ‘a,b,c,d,e’ mostrano solo l’opzione passata ed il proprio eventuale argomento. L’opzione ‘-h’ mostra l’help Solo ‘-c’ accetta un argomento, da passare da linea di comando, dopo l’opzione. Il ‘-‘ (meno) identifica, nella lettera che segue, un’opzione.\n Es.:./opzioni_prova.sh -a -b -c prova -d -e -h
# Controllo che sia stato passato almeno un argomento
if [ $# -eq 0 ] # se lo script è eseguito senza argomenti…
then
echo -e “$help” # … stampo l’help…
exit 1 # … ed esco.
fi
while getopts “:abc:deh” opzione # Dichiaro le opzioni accettate e il tipo
# i ‘:’ (due punti) iniziali sopprimono i messaggi di errore
# i ‘:’ (due punti) dopo un’opzione significano che ci si aspetta un argomento.
# Occhio! Qualsiasi cosa dopo ‘-c’ viene preso come argomento di ‘-c’
do
case $opzione in
# $OPTIND è il puntatore (numerico) all’opzione successiva
# $OPTARG è l’argomento passato, se esiste
a ) echo -e “\nhai inserito l’opzione -a con \$OPTIND: $OPTIND e argomento: $OPTARG”;;
b ) echo -e “\nhai inserito l’opzione -b con \$OPTIND: $OPTIND e argomento: $OPTARG”;;
c ) echo -e “\nhai inserito l’opzione -c con \$OPTIND: $OPTIND e argomento: $OPTARG”;;
d ) echo -e “\nhai inserito l’opzione -d con \$OPTIND: $OPTIND e argomento: $OPTARG”;;
e ) echo -e “\nhai inserito l’opzione -e con \$OPTIND: $OPTIND e argomento: $OPTARG”;;
h ) echo -e “\n$help”;; * ) echo -e “\nÈ stata inserita un’opzione non valida.\n\n $help”;;
esac
done shift $(($OPTIND – 1)) # resetto (come $OPTIND=1)
# Sposta il puntatore all’opzione che segue per esempio il parametro posizionale $1.
exit 0

Nella riga while getopts “:abc:deh” Opzione i primi : (due punti) servono per utilizzare il comando in modalità silenziosa, sopprimendo gli eventuali messaggi di errore.

I : (due punti) posti dopo la lettera c servono ad indicare che l’opzione -c accetta un parametro obbligatorio, se il parametro non viene inserito verrà preso come parametro qualsiasi stringa seguente -c quindi attenzione!

Nella stessa riga, la stringa “opzione” è la variabile impostata dal ciclo while che verrà utilizzata nel costrutto case.
Le righe in case sono quasi tutte del tipo:

a ) echo -e “\nhai inserito l’opzione -a con \$OPTIND: $OPTIND e argomento: $OPTARG”;;
servono solo per mostrare i valori dell’opzione passata, il valore di $OPTIND (che è l’indice numerico dell’opzione successiva) e dell’eventuale valore del parametro passato, contenuto in $OPTARG.
La riga:
h ) echo -e “\n$help”;;
a differenza delle precedenti stampa a video solo quanto scritto nella variabile $help.
La riga:
* ) echo -e “\nÈ stata inserita un’opzione non valida.\n\n $help”;;
intercetta tutto quanto è diverso dalle opzioni indicate precedentemente, quindi le opzioni non valide, informa del fatto e mostra l’help.
La riga:
shift $(($OPTIND – 1))
serve a “resettare” $OPTIND equivale a $OPTIND=1. Dopo aver resettato si potrebbero usare gli eventuali parametri posizionali o anche ripetere il ciclo precedente

Le prove

Conviene scaricare lo script opzioni_prova.sh renderlo eseguibile e provarlo; inizialmente in modo corretto con: ./opzioni_prova.sh -a -b -c prova -d -e -h in seguito conviene provare a passare dati incompleti, con parametro e senza, sbagliati etc. si comprenderà facilmente la forza ed i limiti del comando.

You must be logged in to post a comment.