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 -h
Option (z. B. Hilfe) und eine -a
Option, 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:h
Bit sagt "Ich erwarte, zwei Optionen zu analysieren, -a
und -h
, und -a
sollte ein Argument nehmen" (es ist das :
After a
, das dem Parser sagt, dass es -a
ein 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 -world
Bit 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 bash
Funktion getopts
tatsä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 getopt
und 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=SIZE
Option [einiger Implementierungen] des du
Dienstprogramms (mit der auch -B SIZE
dasselbe 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 dd
und tar
Dienstprogramme, 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 tar
Dienstprogramm hat in jüngster Zeit die Möglichkeit erhalten, Optionen mit Bindestrichen zu verwenden. Das BSD-Handbuch für tar
ruft die alten Optionen für "gebündelte Flags" auf.