Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "leon-wells/ParsingDellaRigaDiComando"
Differenze tra le versioni 85 e 86
Versione 85 del 21/11/2021 02.30.57
Dimensione: 23666
Autore: leon-wells
Commento:
Versione 86 del 21/11/2021 11.20.29
Dimensione: 23838
Autore: leon-wells
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 115: Linea 115:
TEMP=$(getopt --options=$OPZIONI_CORTE --longoptions=$OPZIONI_LUNGHE --name "script_di_prova.sh" -- "$@") TEMP=$(getopt --options="$OPZIONI_CORTE" --longoptions="$OPZIONI_LUNGHE" --name "script_di_prova.sh" -- "$@")
Linea 245: Linea 245:
 * È un built-in della shell. Questo comporta che:  * È un built-in della shell, quindi:
Linea 294: Linea 294:
Il comando viene usato all'interno di un ciclo ''while''. Ad ogni iterazione del ciclo, legge un'opzione, e l'eventuale parametro associato, dalla stringa dei parametri posizionali forniti allo script (o da ''args'', se fornita); se tutto è corretto, aggiorna le sue variabili interne, secondo quanto visto al punto precedente, e fornisce questi dati all'utente per la loro analisi, generalmente all'interno di un costrutto ''case''. Il comando restituisce un exit status 1 quando non ci sono più parametri da leggere, facendo terminare il ciclo. Inoltre, il comando interrompe il parsing se incontra la sequenza di caratteri '--'. Il comando viene usato all'interno di un ciclo ''while''. Ad ogni iterazione, ''getopts'' legge dalla stringa dei parametri posizionali (o da ''args'' se fornito) un'opzione e il suo eventuale parametro. Se tutto è corretto, aggiorna le sue variabili interne, secondo quanto visto al punto precedente, e fornisce questi dati all'utente per la loro analisi, che viene generalmente svolta all'interno di un costrutto ''case''. Il comando restituisce un exit status 1 quando non ci sono più parametri da leggere, facendo terminare il ciclo. Inoltre, il comando interrompe il parsing se incontra la sequenza di caratteri '--'.
Linea 302: Linea 302:
while getopts "ab:cd:" option; while getopts "ab:cd:" option
Linea 307: Linea 307:
            #~ echo "Passata l'opzione: -$option"
            #~ echo "Non ha un parametro associato, quindi OPTARG=$OPTARG"
            echo "Il valore di OPTIND è $OPTIND"
            echo "OPTIND è $OPTIND"
Linea 314: Linea 312:
            #~ echo "Passata l'opzione: -$option"
            #~ echo "Ha un parametro associato, quindi OPTARG=$OPTARG"
            echo "Il valore di OPTIND è $OPTIND"
            echo "OPTIND è $OPTIND"
Linea 320: Linea 316:
            echo "Termino"
            echo "Il valore di OPTIND è $OPTIND"
            echo "OPTIND è $OPTIND" >&2
            echo "Termino" >&2
Linea 326: Linea 322:
            echo "Il valore di OPTIND è $OPTIND"             echo "OPTIND è $OPTIND"
Linea 331: Linea 327:
Linea 344: Linea 341:
foo
}}}

 * {{{
foo
$ ./getoptsExample_verbose.sh -a
Opzione -a, senza argomento
*** *** ***
Il valore di OPTIND è 2
}}}

 * {{{
$ ./getoptsExample_verbose.sh -b 10
Opzione -b, con argomento '10'
OPTIND è 3
*** *** ***
Linea 432: Linea 435:
 * In entrambe le modalità, durante il parsing lo script si aspetta di trovare le opzioni 'v' e 'u' senza parametro associato e le opzioni 'g' ed 'f' con un parametro associato.  * In entrambe le modalità, durante il parsing lo script si aspetta di trovare le opzioni 'a' e 'c' senza parametro associato e le opzioni 'b' e 'd' con un parametro associato.
Linea 437: Linea 440:
 * Per quanto riguarda ''OPTIND'', è utile ricordare che contiene l'indice del parametro posizionale del prossimo argomento da processare e quindi non viene incrementato fino ad aver esaurito l'analisi di tutte le opzioni scritte attaccate (come '-ac' nel *** secondo degli esempi precedenti).


Problemi in questa pagina? Segnalali in questa discussione

Introduzione

Prima di vedere nel dettaglio gli strumenti che le varie shell disponibili su Ubuntu forniscono per fare il parsing della riga di comando, è utile fare una breve introduzione per capire alcuni concetti fondamentali.

Facendo riferimento al comando tar, un modo generico per lanciare questo comando nel terminale è dato da:

tar -cv -f mioArchivio.tar directoryDaArchiviare

Il comando è composto da una serie di stringhe dette argomenti. Il primo argomento è il nome stesso del comando, mentre i successivi sono indicati con il nome di parametri posizionali.
Questi ultimi possono essere suddivisi in alcune categorie logiche:

  • una opzione è un argomento, generalmente incluso nella documentazione del comando, la cui presenza modifica il comportamento del comando stesso.
    Una opzione può esistere nella versione corta, che consiste in un trattino seguito da una singola lettera (ad esempio, '-f' nel comando precedente), o nella versione lunga. Di quest'ultima, si hanno due formati: nello stile GNU si ha un doppio trattino seguito da una serie di due o più lettere (ad esempio '--help'); lo stile XF86 ha un singolo trattino come prefisso (ad esempio '-verbose').
    Più opzioni corte possono essere raggruppate in un singolo argomento (ad esempio, '-cv' nel comando precedente).

  • un parametro è un argomento che può fornire informazioni aggiuntive al comando o a un'opzione a cui si riferisce. Nel comando precedente, 'mioArchivio.tar' è un parametro dell'opzione '-f', mentre 'directoryDaArchiviare' è un parametro per il comando 'tar'. Qualora si volesse aggiungere al comando un parametro che ha l'aspetto di una opzione, ma non la sua funzione, è possibile separarlo dal resto del comando scrivendolo dopo un doppio trattino '--'

Fatta questa premessa, è utile notare che il comando precedente è equivalente al comando:

tar -vcf mioArchivio.tar directoryDaArchiviare

In questo comando, tutte le opzioni corte sono state riunite e ne è stato cambiato l'ordine. Analogamente, l'ordine con cui vengono scritte le opzioni lunghe, insieme ai loro eventuali parametri, non ne altera il significato.

Il parsing della riga di comando è quindi la procedura con cui un comando, o uno script, interpretano le istruzioni fornite dall'utente tramite una opportuna combinazione di opzioni e parametri. Nel caso di uno script, per poter effettuare facilmente questo parsing, si possono usare due strumenti molto versatili: getopt e getopts (fare attenzione alla 's' finale nel secondo comando).

getopt

getopt analizza una stringa di parametri e ne restituisce una versione canonica, ossia una versione standardizzata che potrà poi essere analizzata più facilmente. Generalmente, questa analisi successiva viene eseguita in un ciclo while, all'interno del quale si esegue un'analisi delle casistiche possibili tramite costrutto case.

Pro

  • Supporta sia le opzioni corte, sia quelle lunghe. Di quest'ultime, supporta sia lo stile GNU, sia lo stile XF86.

  • È in grado di gestire opzioni con parametri che siano obbligatori o facoltativi.

Contro

  • La versione descritta in questa guida non è un built-in della shell, ma è inclusa nel pacchetto util-linux e precedentemente nella glibc (cioè, la GNU lib c). Ciononostante, può essere facilmente installata nelle distribuzioni in cui non sia presente di default. È disponibile anche per Inoltre, il comando

    getopt --test

    restituisce un exit code uguale a 4, se la versione installata è quella descritta in questa guida, e può quindi essere usato per un test preliminare all'interno dello script.

Funzionamento

Il comando getopt può essere chiamato con tre diverse sintassi. La più semplice è:

getopt optstring parameters

La stringa optsting elenca le opzioni nel formato corto che il comando può incontrare durante il parsing. Questa stringa può essere racchiusa tra doppi apici. Al suo interno i nomi delle opzioni possono essere elencati senza separatori. Se il carattere che indica l'opzione è seguito dai due punti, l'opzione prevede un parametro obbligatorio; se è seguito da una coppia di doppi punti, il parametro è opzionale. parameters è la stringa degli argomenti su cui operare. Generalmente si pone uguale alla stringa dei parametri posizionali passati allo script, cioè "$@". Se si vuole passare una stringa alternativa, questa non va racchiusa tra apici, né singoli né doppi.

Le altre due sintassi hanno rispettivamente la forma

getopt [options] [--] optstring parameters

e

getopt [options] -o|--options optstring [options] [--] parameters

optstring e parameters sono gli stessi visti nella prima sintassi, mentre le parti racchiuse tra le parentesi quadre sono opzionali e la barra verticale indica che l'opzione alla sua sinistra e quella alla sua destra sono equivalenti.
La stringa options, che nella seconda sintassi può essere presente in due punti, contiene una serie di opzioni e rispettivi parametri che modificano il funzionamento del comando. Tra queste, le più importanti sono:

  • -l|--long|--longoptions longopts

    L'opzione '-l', o le equivalenti '--long' e '--longoptions', indicano che durante il parsing si potranno incontrare opzioni lunghe, i cui nomi vengono specificati nella stringa longopts. Questa stringa può essere racchiusa tra doppi apici e i nomi al suo interno vanno separati con una virgola. Inoltre, se il nome che indica l'opzione lunga è seguito dai due punti, questa accetta un parametro obbligatorio; se è seguito da una coppia di doppi punti, accetta un parametro facoltativo.

  • -a|--alternative

    Vengono riconosciute le opzioni lunghe nello stile XF86, quindi con un singolo trattino iniziale.

  • -n|--name progname

    Imposta il nome dello script al contenuto della variabile progname.

  • -q|--quiet

    L'output degli errori da parte di getopt è disabilitato.

  • -Q|--quiet-output

    Non viene prodotto l'output di getopt, ovvero la stringa normalizzata dei parametri passati allo script, ma gli errori incontrati nel parsing vengono ancora riportati.

Esempi di chiamate al comando

I seguenti esempi d'uso mostrano come chiamare getopt facendo riferimento, rispettivamente, alle tre sintassi viste:

  • getopt "hf:d::" "$@"

    Con questa chiamata, getopt potrà accettare l'opzione 'h' senza parametro, l'opzione 'f' con un parametro obbligatorio e l'opzione 'd' con un parametro facoltativo.

  • getopt -l "help,file:,dir::" -- "hf:d::" "$@"

    Ora, getopt accetta anche le opzioni nella versione lunga: 'help' senza parametro, 'file' con un parametro obbligatorio e 'dir' con un parametro facoltativo.

  • getopt -l "help,file:dir::" -o "hf:d::" -a -- "$@"

    Qui getopt accetta le stesse opzioni del caso precedente, ma queste possono essere indicate anche nello stile XF86.

È importante sottolineare che, negli argomenti passati allo script, opzioni e relativi parametri rispettano le seguenti regole:

  • Se un'opzione corta accetta un parametro obbligatorio, opzione e parametro possono essere scritti attaccati o separati da uno spazio. Se il parametro è facoltativo, devono essere scritti attaccati.
  • Se un'opzione lunga accetta un parametro obbligatorio, opzione e parametro possono solo essere separati da uno spazio o dal carattere '='. Se il parametro è obbligatorio, devono essere separati dal carattere '='.
  • Le opzioni corte possono essere raggruppate e scritte in qualsiasi ordine, con l'accortezza di lasciare accoppiate ai propri parametri quelle che li prevedono.
  • getopt riconosce qualsiasi abbreviazione non ambigua delle opzioni nel formato lungo. Facendo riferimento agli esempi precedenti, l'opzione '--fi' sarà quindi riconosciuta come --file nel caso non ci sia rischio di ambiguità con altre opzioni.

Esempio d'uso

Lo script che segue accetta l'opzione 'a' senza parametro, l'opzione 'b' con parametro obbligatorio e l'opzione 'c' con parametro facoltativo. Sono accettate anche le rispettive varianti lunghe 'a-lunga', 'b-lunga' e 'c-lunga' nello stile Gnu (con due trattini come prefisso).

#! /bin/bash

getopt --test > /dev/null
if [[ $? -ne 4 ]]; then
    echo "La versione di getopt non è quella del pacchetto utils-linux"
    exit 1
fi

OPZIONI_CORTE=ab:c::
OPZIONI_LUNGHE=a-lunga,b-lunga:,c-lunga::

TEMP=$(getopt --options="$OPZIONI_CORTE" --longoptions="$OPZIONI_LUNGHE" --name "script_di_prova.sh" -- "$@")
if [[ $? -ne 0 ]]; then
    echo "getopt ha fallito il parsing"
    exit 2
fi

echo "Versione canonica dei parametri prodotta da getopt: "$TEMP""

eval set -- "$TEMP"

while true
do
    case "$1" in
        -a|--a-lunga) 
            echo "Opzione '$1', senza argomento."
            shift
            ;;
        -b|--b-lunga) 
            echo "Opzione '$1', con argomento '$2'."
            shift 2
            ;;
        -c|--c-lunga)
            case "$2" in
                "") 
                    echo "Opzione '$1', senza argomento."
                    shift 2
                    ;;
                *)  
                    echo "Option c, con argomento '$2'."
                    shift 2
                    ;;
            esac
            ;;
        --) 
            shift
            break
            ;;
        *) 
            echo "Errore interno!"
            exit  ;;
    esac
done

if [[ $# != 0 ]]
then
    echo "Argomenti rimanenti:"
    for i in "$@"
    do
        echo "--> '"$i"'"
    done
fi

Supponendo di aver salvato lo script con il nome script_di_prova_getopt.sh, di seguito viene mostrata una lista di differenti modi di chiamarlo e alcuni dei rispettivi output prodotti:

  • $ ./script_di_prova_getopt.sh foo -a bar 
    Versione canonica dei parametri prodotta da getopt:  -a -- 'foo' 'bar' 
    Opzione '-a', senza argomento.
    Argomenti rimanenti:
    --> 'foo'
    --> 'bar'
    L'argomento 'foo' non viene associato all'opzione 'a', ma interpretato come argomento a se stante ed elencato inseme a 'bar' tra gli argomenti rimanenti dopo il parsing.
  • $ ./script_di_prova_getopt.sh  -b 5 bar foo
    Versione canonica dei parametri prodotta da getopt:  -b '5' -- 'bar' 'foo' 
    Opzione '-b', con argomento '5'.
    Argomenti rimanenti:
    --> 'bar'
    --> 'foo'
    Per 'foo' e 'bar' si ha lo stesso comportamento del comando precedente, mentre l'argomento '5' viene associato all'opzione '-b'. Visto che per questa opzione il parametro è obbligatorio, si può usare la sintassi equivalente '-b5'.
  • I due esempi precedenti possono essere sintetizzati nel comando:
    $ ./script_di_prova_getopt.sh  -ab 5 foo bar
    Versione canonica dei parametri prodotta da getopt:  -a -b '5' -- 'foo' 'bar' 
    Opzione '-a', senza argomento.
    Opzione '-b', con argomento '5'.
    Argomenti rimanenti:
    --> 'foo'
    --> 'bar'
    in cui, di nuovo, '-b' e '5' possono essere scritti attaccati.
  • La posizione dei parametri passati allo script può variare, quindi il precedente comando è equivalente a
    $ ./script_di_prova_getopt.sh  foo -b5 bar -a
    Versione canonica dei parametri prodotta da getopt:  -b '5' -a -- 'foo' 'bar' 
    Opzione '-b', con argomento '5'.
    Opzione '-a', senza argomento.
    Argomenti rimanenti:
    --> 'foo'
    --> 'bar'
    e a tutte le altre combinazioni consistenti con la sintassi descritta precedentemente.
  • Qualora si volesse usare la versione lunga dell'opzione con parametro obbligatorio, le due sintassi equivalenti sarebbero
    $ ./script_di_prova_getopt.sh --b-lunga 5
    e
    $ ./script_di_prova_getopt.sh --b-lunga=5
  • Per l'opzione corta '-c', che accetta un parametro opzionale, l'unica sintassi valida per passare il parametro è quella in cui i due vengono scritti attaccati
    $ ./script_di_prova_getopt.sh -c6
  • Nel caso dell'opzione lunga '--c-lunga', i due sono separati dal carattere '='
    $ ./script_di_prova_getopt.sh --c-lunga=6 

Considerazioni sull'esempio d'uso

  • La riga
    echo "Versione canonica dei parametri prodotta da getopt: "$TEMP" "

    visualizza la riorganizzazione dei parametri nella versione canonica prodotta da getopt, ma ai fini del funzionamento dello script è superflua.

  • L'istruzione

    eval set -- "$TEMP"

    sostituisce i parametri posizionali passati allo script con la stringa TEMP, che è la loro versione canonica. In alcuni script è possibile che manchi l'istruzione eval. In questo caso, sono script non portabili pensati per BSD. La versione in cui è presente anche eval risulta portabile. Infine, le doppie virgolette che racchiudono $TEMP sono fondamentali.

  • Il comando shift viene utilizzato all'interno del costrutto case per avanzare nella lettura dei parametri posizionali passati allo script. Nel caso di un'opzione senza parametro, si shifta di una posizione; nel caso dei due trattini '--' si shifta di una posizione e si interrompe il parsing; nel caso di una opzione con parametro facoltativo, si shifta di due posizioni.

  • Il costrutto case nidificato è un esempio di come si gestisce un'opzione che abbia un parametro facoltativo.

getopts

Pro

  • È un built-in della shell, quindi:
    • è definito nello standard POSIX e non c'è bisogno di fare attenzione alle sue diverse implementazioni.
    • Non ha bisogno di programmi esterni per accedere ai parametri posizionali;
    • può avere accesso diretto alle variabili della shell, che può usare per fare il parsing.

Contro

  • È in grado di fare il parsing solo delle opzioni corte. Se lo script prevede l'uso di opzioni lunghe, sia nello stile GNU sia nello stile XF86, getopts non è la scelta opportuna.

  • Non supporta le opzioni con parametri facoltativi.

Funzionamento

La sintassi del comando è:

getopts optstring varname [args]

in cui

Parametro

Descrizione

optstring

È una stringa che istruisce il comando getopts relativamente a quali opzioni aspettarsi e quando siano previsti i relativi parametri.

varname

È una stringa che rappresenta il nome della variabile della shell in cui il comando getopts inserisce il valore delle opzioni lette.

args

È una stringa opzionale. Di default getopts fa il parsing dei parametri posizionali, cioè della stringa $@; se è presente una stringa args, farà il parsing dei parametri contenuti in quest'ultima.

Come visto nella tabella, il comando getopts viene istruito sulle opzioni e gli eventuali parametri che si può aspettare tramite optstring. La sintassi di questa stringa è molto semplice.

  • Ogni opzione che si vuole aggiungere, viene indicata con la relativa lettera. Per queste ultime, non sono consentiti i caratteri ':' e '?'.
  • Se l'opzione prevede un parametro ad essa associato, il carattere associato all'opzione in optstring va fatto seguire dal carattere ':'. Quindi, se si vuole aggiungere l'opzione 'f' e a questa si vuole associare un parametro, nella stringa optstring si aggiungerà la sequenza 'f:'

  • Il comando getopts può essere impostato nella modalità silenziosa, aggiungendo il carattere ':' come suffisso di optstring. Se questo carattere è assente, getopts è in modalità verbosa. La differenza è che nel seconda modalità produrrà dei messaggi in caso di errori durante il parsing. Generalmente, si opta per la modalità silenziosa e la gestione autonoma dei messaggi d'errore. Inoltre, tramite la variabile OPTERR (vedi sotto) si può comunque silenziare la stampa dei messaggi di errore nella modalità verbosa.

Se, ad esempio, volessimo che getopts si aspetti di incontrare nel parsing le opzione 'v' ed 'h' senza parametri associati e l'opzione 'f' con un parametro associato, optstring sarebbe uguale a "vhf:" per la modalità verbosa e uguale a ":vhf:" per quella silenziosa.

Per il suo funzionamento, getopts usa le seguenti variabili

Variabile

Descrizione

OPTIND

È una variabile della shell, che contiene l'indice del parametro posizionale del prossimo argomento da processare. Viene modificata da getopts, che la usa per tenere traccia del proprio stato. Torna utile anche per poter fare uno shift dei parametri posizionali, dopo averli analizzati con getopts.

OPTARG

Viene impostata al valore dell'argomento relativo a ogni parametro trovato da getopts. Se l'opzione passata è sconosciuta, viene impostato al valore dell'opzione.

OPTERR

È una variabile di bash che può assumere il valore 1 o 0, a seconda che si desideri o meno che la shell mostri il messaggio d'errore generato automaticamente da getopts. Di default è impostata ad 1 e ha senso modificarla solo nella modalità verbosa. Non è supportata in shell quali ksh93, mksh, zsh, or dash.

La gestione del parametro varname e della variabile OPTARG cambia a seconda della modalità in cui si usa getopts ed è riassunta nella seguente tabella:

Modalità verbosa

opzione
non valida

varname è posto uguale al carattere '?'
OPTARG è lasciato vuoto.

parametro obbligatorio
non fornito

varname è posto uguale al carattere '?'
OPTARG è lasciato vuoto e viene stampato un messaggio d'errore.

Modalità silenziosa

opzione
non valida

varname è posto uguale al carattere '?'
OPTARG è posto uguale all'opzione non valida.

parametro obbligatorio
non fornito

varname è posto uguale al carattere ':'
OPTARG è posto uguale all'opzione

Esempi d'uso

Il comando viene usato all'interno di un ciclo while. Ad ogni iterazione, getopts legge dalla stringa dei parametri posizionali (o da args se fornito) un'opzione e il suo eventuale parametro. Se tutto è corretto, aggiorna le sue variabili interne, secondo quanto visto al punto precedente, e fornisce questi dati all'utente per la loro analisi, che viene generalmente svolta all'interno di un costrutto case. Il comando restituisce un exit status 1 quando non ci sono più parametri da leggere, facendo terminare il ciclo. Inoltre, il comando interrompe il parsing se incontra la sequenza di caratteri '--'.

Modalità verbosa

#!/bin/bash

while getopts "ab:cd:" option
do
    case $option in
        a)
            echo "Opzione -$option, senza argomento"
            echo "OPTIND è $OPTIND"
            echo "*** *** ***"
            ;;
        b)
            echo "Opzione -$option, con argomento '"$OPTARG"'"
            echo "OPTIND è $OPTIND"
            echo "*** *** ***"
            ;;
        \?)
            echo "OPTIND è $OPTIND" >&2
            echo "Termino" >&2
            exit 1
            ;;
        *) 
            echo "Opzione non ancora implementata: -$option"
            echo "OPTIND è $OPTIND"
            echo "*** *** ***"
            ;;
    esac
done

shift $((OPTIND - 1))

if [[ $# -ne 0 ]]
then
    echo "Rimangono da analizzare i parametri:"
    for i in "$@"
    do
        echo "--> '"$i"'"
    done
fi

Alcuni esempi dell'output generato da questo script sono:

  • $ ./getoptsExample_verbose.sh -a
    Opzione -a, senza argomento
    *** *** ***
    Il valore di OPTIND è 2
  • $ ./getoptsExample_verbose.sh -b 10
    Opzione -b, con argomento '10'
    OPTIND è 3
    *** *** ***
  • foo
  • foo

Modalità sileziosa

#!/usr/bin/env bash

while getopts ":ab:cd:" option;
do
    case $option in
        a)
            echo "Opzione -$option, senza argomento"
            #~ echo "Passata l'opzione: -$option"
            #~ echo "Non ha un parametro associato, quindi OPTARG=$OPTARG"
            echo "Il valore di OPTIND è $OPTIND"
            echo "*** *** ***"
            ;;
        b)
            echo "Opzione -$option, con argomento '"$OPTARG"'"
            #~ echo "Passata l'opzione: -$option"
            #~ echo "Ha un parametro associato, quindi OPTARG=$OPTARG"
            echo "Il valore di OPTIND è $OPTIND"
            echo "*** *** ***"
            ;;
        \?)
            echo "Opzione non valida: -$OPTARG" >&2
            echo "Il valore di OPTIND è $OPTIND" >&2
            echo "*** *** ***"
            exit 1
            ;;
        :)
            echo "L'opzione: -$OPTARG richede un parametro, che non è stato passato" >&2
            echo "Il valore di OPTIND è $OPTIND" >&2
            echo "*** *** ***"
            exit 1
            ;;
        *)
            echo "Opzione non ancora implementata: -$option" >&2
            exit 1
    esac
done

shift $((OPTIND -1))

if [[ $# -ne 0 ]]
then
    echo "Rimangono da analizzare i parametri:"
    for i in "$@"
    do
        echo "--> '"$i"'"
    done
fi

Alcuni esempi dell'output generato da questo script sono:

  • foo
  • foo
  • foo
  • foo

Considerazioni sugli esempi d'uso

  • In entrambe le modalità, durante il parsing lo script si aspetta di trovare le opzioni 'a' e 'c' senza parametro associato e le opzioni 'b' e 'd' con un parametro associato.
  • Nella versione verbosa, il caso \?) gestisce sia un'opzione non valida sia l'assenza di un parametro obbligatorio. La stampa dell'errore è gestita direttamente dal comando getopts, che continua il parsing dopo aver comunicato l'errore. Se si desidera che il programma termini la sua esecuzione in questi due casi, deve essere richiesto esplicitamente, ad esempio con il comando exit.

  • Nella versione silenziosa, il caso \?) gestisce un'opzione non valida e il caso :) l'assenza di un parametro obbligatorio.

  • Il caso *) permette di gestire eventuali opzioni non ancora implementate all'interno dello script. Nei due esempi, le opzioni non ancora implementate sono 'u' ed 'f'. Questa modalità risulta molto comoda nella fase di implementazione.
  • L'istruzione shift successiva al ciclo while ha lo scopo di eliminare dalla stringa dei parametri posizionali quelli che sono già stati analizzati con getopts. Il parametro OPTIND assicura infatti di ottenere lo shift di tutti i parametri già letti. In questo modo, lo script è in grado di gestire successivamente anche eventuali ulteriori parametri posizionali.

  • Per quanto riguarda OPTIND, è utile ricordare che contiene l'indice del parametro posizionale del prossimo argomento da processare e quindi non viene incrementato fino ad aver esaurito l'analisi di tutte le opzioni scritte attaccate (come '-ac' nel *** secondo degli esempi precedenti).

Ulteriori risorse


CategoryNuoviDocumenti