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 -h
un'opzione (per esempio aiuto) e -a
un'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:h
bit dice "Mi aspetto di analizzare due opzioni -a
e -h
, e -a
dovrei prendere un argomento" (è il :
dopo a
che dice al parser che -a
accetta 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 -world
indica 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 bash
funzione di getopts
può 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 getopt
e getopt
simili 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=SIZE
opzione di [alcune implementazioni] du
dell'utilità (che consente anche -B SIZE
di 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à dd
e 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' tar
utilità ha acquisito la capacità di prendere opzioni con trattini in tempi più recenti. Il manuale BSD per tar
chiama le opzioni vecchio stile per "flag raggruppati".