Le miniguide di UbaWeb

Opzioni da linea di comando con getopts

Premessa Torna su

14 ottobre 2012 - Linux 2.6.32-44-generic-pae -Ubuntu i686 GNU/Linux - Oggi con il motogp ho finito presto allora ho deciso di imparare qualcosa di nuovo in "Bash". 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 altroParametro.
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". Visto che la pagina man di Bash, non mi è sembrata illuminante, mi sono 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 baseTorna su

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 # scritto il 14 ottobre 2012 da Giovanni Ubaldi # pubblicato su www.ubaweb.it/miniguide/opzioni_prova.php 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 proveTorna su

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.

Ciao 8-)

Torna su
Sito realizzato da: UbaWeb di Giovanni Ubaldi

Licenza Creative Commons Tutto il contenuto di questo sito se non diversamente dichiarato è di Giovanni Ubaldi ed è distribuito con Licenza:

Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.