Wenn Sie das Befehlszeilen-Parsing-Bit Ihres Codes schreiben, geben Sie an, welche Optionen Argumente annehmen und welche nicht. Beispiel: In einem Shell-Skript akzeptieren Sie eine -hOption (z. B. Hilfe) und eine -aOption, die ein Argument enthalten soll
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"
Das a:hBit sagt "Ich erwarte, zwei Optionen zu analysieren, -aund -h, und -asollte ein Argument nehmen" (es ist das :After a, das dem Parser sagt, dass es -aein Argument nimmt).
Daher gibt es keine Unklarheit, wo eine Option endet, wo ihr Wert beginnt und wo eine andere danach beginnt.
Laufen es:
$ 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
Aus diesem Grund sollten Sie die meiste Zeit keinen eigenen Befehlszeilenparser schreiben, um Optionen zu analysieren.
In diesem Beispiel gibt es nur einen Fall, der schwierig ist. Das Parsen stoppt normalerweise bei der ersten Nicht-Option. Wenn Sie also Dinge in der Befehlszeile haben, die wie Optionen aussehen :
$ 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
Das Folgende löst das:
$ bash test.sh -a hello -- -world
h: 0
a: hello
Das --signalisiert ein Ende der Befehlszeilenoptionen, und das -worldBit bleibt dem Programm übrig, um zu tun, was es will (es befindet sich in einer der Positionsvariablen).
Das ist übrigens, wie Sie eine Datei entfernen, die einen Bindestrich am Anfang ihres Dateinamens mit hat rm.
EDIT :
In C aufgerufene getopt()(in deklarierte unistd.h) Dienstprogramme, die auf die gleiche Weise funktionieren. Soweit wir wissen, kann die bashFunktion getoptstatsächlich unter Verwendung eines Aufrufs der C-Bibliotheksfunktion implementiert werden getopt(). Perl, Python und andere Sprachen verfügen über ähnliche Befehlszeilen-Analysebibliotheken, und es ist sehr wahrscheinlich, dass sie ihre Analyse auf ähnliche Weise durchführen.
Einige dieser getoptund getoptähnliche Bibliotheksroutinen verarbeiten auch "lange" Optionen. Vor diesen steht normalerweise double-dash ( --), und lange Optionen, die Argumente enthalten, werden häufig nach einem Gleichheitszeichen angegeben, z. B. die --block-size=SIZEOption [einiger Implementierungen] des duDienstprogramms (mit der auch -B SIZEdasselbe angegeben werden kann).
Die Grundhandbücher werden oft geschrieben, um ein Leerzeichen zwischen den kurzen Optionen anzuzeigen, und ihre Argumente dienen wahrscheinlich der Lesbarkeit.
BEARBEITEN : Wirklich alte Werkzeuge, wie die ddund tarDienstprogramme, haben Optionen ohne Bindestriche vor sich. Dies geschieht ausschließlich aus historischen Gründen und um die Kompatibilität mit Software aufrechtzuerhalten, die darauf angewiesen ist, dass sie genau so funktioniert. Das tarDienstprogramm hat in jüngster Zeit die Möglichkeit erhalten, Optionen mit Bindestrichen zu verwenden. Das BSD-Handbuch für tarruft die alten Optionen für "gebündelte Flags" auf.