W getopt
linii poleceń bash znajduje się polecenie. getopt
może być używany z krótkimi opcjami (np. getopt -o axby "$@"
) i może być używany zarówno z krótkimi, jak i długimi opcjami (np. getopt -o axby -l long-key -- "$@"
), ale teraz potrzebuję tylko długich opcji (tj. krótkie opcje w ogóle nie istnieją), jednak polecenie getopt -l long-key -- "$@"
nie --long-key
poprawnie przeanalizuj opcję. Więc w jaki sposób można użyć getopt
polecenia z zaledwie długich opcji? Czy jest to niemożliwe, czy to tylko błąd getopt
polecenia?
13
getopts
, ale używasz/usr/bin/getopt
polecenia.Odpowiedzi:
getopt
jest całkowicie w porządku, bez krótkich opcji. Ale musisz powiedzieć, że nie masz krótkich opcji. To dziwactwo w składni - z instrukcji:Oto, co dzieje się w teście:
getopt -l long-key -- --long-key foo
traktuje--long-key
jako listę opcji-egklnoy
ifoo
jako jedyny argument. Posługiwać sięna przykład
źródło
getopts
igetopt
zarażał twoją odpowiedź? Zaczynasz od komentowania,getopts
a potem tylko wspomnieniagetopt
.getopt
programu z GNU coreutils, o to właśnie chodzi. Naprawiłem tekst, który powiedziałgetopts
. Dzięki.getopts
nawet nie robi długich opcji, więc żadne z nich nie miałoby zastosowaniagetopts
.getopts
tag. Nie chciałem zmieniać twojej odpowiedzi, ponieważ zwykle wiesz znacznie lepiej ode mnie, o czym piszesz :-)Nie wiem,
getopt
alegetopts
wbudowanego można używać do obsługi tylko długich opcji takich jak ten:Oczywiście, jak to jest, to nie działa, jeśli długie opcje mają argumenty. Można to jednak zrobić, ale jak nauczyłem się nad tym pracować. Chociaż początkowo umieściłem go tutaj, zdałem sobie sprawę, że w przypadku długich opcji nie ma wiele użyteczności. W tym przypadku skracałem moje
case
(match)
pola tylko o jedną, przewidywalną postać. Teraz wiem, że doskonale nadaje się do krótkich opcji - jest najbardziej przydatny, gdy zapętla ciąg o nieznanej długości i wybiera pojedyncze bajty zgodnie z ciągiem opcji. Ale gdy opcją jest argument, niewiele można zrobić zfor var do case $var in
kombinacją, którą mógłby zrobić. Myślę, że lepiej jest, aby było to proste.Podejrzewam, że to samo dotyczy prawdy,
getopt
ale nie wiem o niej wystarczająco dużo, aby powiedzieć z całą pewnością. Biorąc pod uwagę poniższą tablicę arg, zademonstruję mój własny parser arg - który zależy przede wszystkim od relacji ewaluacja / przypisanie, którą doceniamalias
i$((shell=math))
.To ciąg arg, z którym będę pracował. Teraz:
Przetwarza tablicę arg na jeden z dwóch różnych sposobów, w zależności od tego, czy podajesz jej jeden czy dwa zestawy argumentów oddzielone
--
separatorem. W obu przypadkach dotyczy to sekwencji przetwarzania do tablicy arg.Jeśli nazwiesz to tak:
Jego pierwszym zadaniem będzie napisanie
acase()
funkcji, która będzie wyglądać następująco:I obok
shift 3
. Podstawienie polecenia wacase()
definicji funkcji jest oceniane, gdy powłoka wywołująca buduje dane wejściowe funkcji tutaj, aleacase()
nigdy nie jest wywoływana ani definiowana w powłoce wywołującej. Jest on oczywiście wywoływany w podpowłoce, dzięki czemu można dynamicznie określać interesujące opcje w wierszu poleceń.Jeśli podasz mu tablicę bez rozdzielaczy, po prostu zapełni
acase()
się ona dopasowaniami dla wszystkich argumentów rozpoczynających się od łańcucha--
.Funkcja praktycznie całe przetwarzanie odbywa się w podpowłoce - iteracyjnie zapisuje każdą wartość arg do aliasów przypisanych nazwami asocjacyjnymi. Po przejściu wypisuje każdą zapisaną wartość
alias
- która jest określona przez POSIX, aby wydrukować wszystkie zapisane wartości cytowane w taki sposób, aby ich wartości mogły zostać ponownie wprowadzone do powłoki. Więc kiedy to zrobię ...Jego dane wyjściowe wyglądają następująco:
Przechodząc przez listę argumentów, sprawdza zgodność bloku bloku z przypadkiem. Jeśli znajdzie tam dopasowanie, rzuca flagę
f=optname
. Dopóki nie znajdzie ponownie prawidłowej opcji, doda każdy kolejny argument do tablicy, którą buduje na podstawie bieżącej flagi. Jeśli ta sama opcja zostanie podana wiele razy, wyniki się złożą i nie będą zastępować. Wszystko, co nie jest w przypadku - lub jakiekolwiek argumenty następujące po ignorowanych opcjach - są przypisywane do ignorowanej tablicy.Dane wyjściowe są chronione przez powłokę do automatycznego wprowadzania przez powłokę przez powłokę, a zatem:
... powinno być całkowicie bezpieczne. Jeśli z jakiegoś powodu nie jest to bezpieczne, prawdopodobnie powinieneś zgłosić raport o błędzie do opiekuna powłoki.
Przypisuje dwa rodzaje wartości aliasów dla każdego dopasowania. Po pierwsze, ustawia flagę - dzieje się tak niezależnie od tego, czy opcja poprzedza niepasujące argumenty. Tak więc każde wystąpienie
--flag
na liście argumentów zostanie uruchomioneflag=1
. To się nie komplikuje ---flag --flag --flag
po prostu dostajeflag=1
. Wartość ta jednak zwiększa się - dla wszelkich argumentów, które mogą za nią następować. Może być używany jako klucz indeksu. Po wykonaniueval
powyższych czynności mogę:... żeby dostać ...
A więc:
WYNIK
I do argumentów, które nie pasują, zastąpiłbym ignorowane w powyższym
for ... in
polu, aby uzyskać:źródło