Quando si scrive il bit di analisi della riga di comando del codice, si specifica quali opzioni accettano argomenti e quali no. Ad esempio, in uno script shell che accetta -hun'opzione (per esempio aiuto) e -aun'opzione che dovrebbe accettare un argomento, lo fai
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
Il a:hbit dice "Mi aspetto di analizzare due opzioni -ae -h, e -adovrei prendere un argomento" (è il :dopo ache dice al parser che -aaccetta un argomento).
Pertanto, non vi è mai alcuna ambiguità nel punto in cui un'opzione termina, dove inizia il suo valore e dove ne inizia un'altra.
Eseguendolo:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
Questo è il motivo per cui la maggior parte delle volte non dovresti scrivere il tuo parser della riga di comando per analizzare le opzioni.
C'è solo un caso in questo esempio che è complicato. L'analisi di solito si interrompe alla prima non opzione, quindi quando nella riga di comando sono presenti elementi che sembrano opzioni:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
Quanto segue risolve che:
$ bash test.sh -a hello -- -world
h: 0
a: hello
Il --segnale -worldindica la fine delle opzioni della riga di comando e il bit viene lasciato al programma per fare quello che vuole (è in una delle variabili posizionali).
Questo è, tra l'altro, il modo in cui rimuovi un file che ha un trattino all'inizio del suo nome rm.
MODIFICA :
Utilità scritte in C call getopt()(dichiarate in unistd.h) che funzionano più o meno allo stesso modo. In effetti, per quanto ne sappiamo, la bashfunzione di getoptspuò essere implementato usando una chiamata alla funzione di libreria C getopt(). Perl, Python e altri linguaggi hanno librerie di analisi della riga di comando simili ed è molto probabile che eseguano l'analisi in modi simili.
Alcune di queste getopte getoptsimili routine di libreria gestiscono anche opzioni "lunghe". Questi sono generalmente preceduti da double-dash ( --), e le opzioni lunghe che accettano argomenti spesso lo fanno dopo un segno di uguale, ad esempio l' --block-size=SIZEopzione di [alcune implementazioni] dudell'utilità (che consente anche -B SIZEdi specificare la stessa cosa).
Il motivo per cui i manuali sono spesso scritti per mostrare uno spazio tra le opzioni brevi e i loro argomenti è probabilmente per la leggibilità.
EDIT : strumenti davvero vecchi, come i programmi di utilità dde tar, hanno opzioni senza trattini davanti a loro. Questo è puramente per ragioni storiche e per mantenere la compatibilità con i software che si affidano a loro per funzionare esattamente in quel modo. L' tarutilità ha acquisito la capacità di prendere opzioni con trattini in tempi più recenti. Il manuale BSD per tarchiama le opzioni vecchio stile per "flag raggruppati".