Czy istnieją jakieś wbudowane narzędzia, które rozpoznają -x
i --xxxx
jak przełączniki, a nie argumenty, czy trzeba przejść przez wszystkie zmienne wejściowe, test na kresek, a następnie przeanalizować argumenty potem?
shell
shell-script
options
getopts
użytkownik394
źródło
źródło
getopt
zawsze należy zweryfikować jako GNU getopt przed użyciem, ale i tak nie należy go używać, ponieważ i takgetopts
jest bardziej przenośny (i ogólnie ładniejszy). Jeśli zrobić potrzebę, aby zadzwonić go z jakiegoś powodu nazywają go w GNU specyficzny sposób, i upewnić się, żeGETOPT_COMPATIBLE
nie jest w środowisku.while getopts "ab:" opt
?:
Po literze opcji oznacza, że wymaga argumentu. A:
jako pierwszy znak oznacza pomijanie komunikatów o błędach.Zakładam, że używasz bash lub podobnego. Przykład:
źródło
+=
z tablicą. Nie wiedziałem, że możesz to zrobić. Ładny!Musisz napisać cykl, aby przeanalizować parametry. Rzeczywiście możesz użyć
getopts
polecenia, aby zrobić to łatwo.To prosty przykład ze
getopts
strony podręcznika:źródło
Niedawno napisałem skrypt do pracy, który był wszechstronny i pozwalał na wiele rodzajów przełączników w dowolnej kolejności. Nie mogę ujawnić pełnego skryptu z oczywistych względów prawnych (nie wspominając o tym, że w tej chwili nie mam go przy sobie), ale oto jego sedno .. możesz umieścić go w podprogramie i nazwać na końcu twojego skryptu:
Polecam ograniczenie skryptu bash do mniej niż 400 linii / 15k znaków; mój wyżej wspomniany skrypt przekroczył ten rozmiar i stał się bardzo trudny do pracy. Zacząłem przepisywać go w Perlu, który jest znacznie bardziej odpowiedni do tego zadania. Pamiętaj o tym podczas pracy nad skryptami w bash. Bash jest świetny dla małych skryptów i onelinerów, ale cokolwiek bardziej złożonego i lepiej pisać w Perlu.
Uwaga: nie testowałem powyższego, więc prawdopodobnie to nie działa, ale wyprowadzasz z tego ogólny pomysł.
źródło
options
na końcu, jest nieprawidłowy, wróci-bash: syntax error near unexpected token $@
. Nazwij to jakoptions "$@"
.while
warunek nie powinien być(($#))
zamiast tego?$#
? Edycja: masz rację. Naprawiono towhile (( "$#" ))