Kiedy piszesz bit parsowania wiersza poleceń swojego kodu, określasz, które opcje przyjmują argumenty, a które nie. Na przykład w skrypcie powłoki akceptującym -h
opcję (na przykład pomoc) i -a
opcję, która powinna przyjąć argument, robisz
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"
a:h
Bit mówi „Czekam analizować dwie opcje, -a
i -h
, i -a
powinna podjąć argument” (jest to :
po a
to mówi parser który -a
pobiera argumentu).
Dlatego nigdy nie ma dwuznaczności, gdzie kończy się opcja, gdzie zaczyna się jej wartość, a gdzie zaczyna się kolejna.
Uruchamianie:
$ 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
Właśnie dlatego przez większość czasu nie powinieneś pisać własnego parsera wiersza poleceń do analizowania opcji.
W tym przykładzie jest tylko jeden przypadek, który jest trudny. Analiza zwykle kończy się przy pierwszej opcji, więc gdy w wierszu polecenia masz elementy wyglądające jak opcje:
$ 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
Następujące rozwiązuje, że:
$ bash test.sh -a hello -- -world
h: 0
a: hello
Te --
sygnały końca opcji wiersza poleceń, a -world
bit zostaje w programie robić co chce z (to jest w jednej ze zmiennych pozycyjnych).
Tak przy okazji, usuwasz plik z myślnikiem na początku jego nazwy za pomocą rm
.
EDYCJA :
Narzędzia napisane w wywołaniu C getopt()
(zadeklarowane w unistd.h
), które działają prawie tak samo. W rzeczywistości, wszyscy wiemy, bash
funkcja getopts
może być realizowana za pomocą wywołanie funkcji biblioteki C getopt()
. Perl, Python i inne języki mają podobne biblioteki parsujące wiersze poleceń i najprawdopodobniej przeprowadzają parsowanie w podobny sposób.
Niektóre z tych getopt
i getopt
podobnych procedur bibliotecznych obsługują również „długie” opcje. Są one zwykle poprzedzone podwójnym myślnikiem ( --
), a długie opcje, które pobierają argumenty, często robią to po znaku równości, na przykład --block-size=SIZE
opcja [niektóre implementacje] du
narzędzia (które pozwala również na -B SIZE
określenie tej samej rzeczy).
Powodem, dla którego podręczniki są często pisane, aby pokazać odstęp między krótkimi opcjami i ich argumentami, jest prawdopodobnie czytelność.
EDYCJA : Naprawdę stare narzędzia, takie jak dd
i tar
narzędzia, mają przed sobą opcje bez myślników. Wynika to wyłącznie z przyczyn historycznych i dla zachowania zgodności z oprogramowaniem, które polega na tym, że działają w ten właśnie sposób. tar
Narzędzie zyskał zdolność do podejmowania opcje z kreskami w ostatnich czasach. Podręcznik BSD do tar
wywoływania opcji w starym stylu dla „flag pakietowych”.