Wiem, że w bashu mogę łatwo uzyskać takie parametry pozycjonowania:
$0
lub $1
Chcę mieć możliwość korzystania z takich opcji flagi, aby określić, do czego służy każdy parametr:
mysql -u user -h host
Jaki jest najlepszy sposób na uzyskanie -u param
wartości i -h param
wartości według flagi zamiast pozycji?
Odpowiedzi:
To jest idiom, którego zwykle używam:
Kluczowe punkty to:
$#
to liczba argumentówźródło
--action*
i--output-dir*
przypadki?--action=[ACTION]
a także w przypadku, gdy ktoś--action [ACTION]
*)
co się tam włamujesz, nie powinieneś wyjść lub zignorować złej opcji? Innymi słowy część nigdy nie jest przetwarzane.-bad -o dir
-o dir
W tym przykładzie użyto wbudowanego
getopts
polecenia Bash i pochodzi ono z Przewodnika po stylu Google Shell :Uwaga: jeśli po znaku następuje dwukropek (np.
f:
), Oczekuje się, że ta opcja będzie miała argument.Przykładowe użycie:
./script -v -a -b -f filename
Korzystanie z getopts ma kilka zalet w stosunku do przyjętej odpowiedzi:
-a -b -c
→-abc
)Jednak dużą wadą jest to, że nie obsługuje długich opcji, tylko opcje jednoznakowe.
źródło
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;
getopt jest twoim przyjacielem .. prosty przykład:
W katalogu / usr / bin powinny znajdować się różne przykłady.
źródło
/usr/share/doc/util-linux/examples
, przynajmniej na maszynach Ubuntu.Myślę, że byłby to prostszy przykład tego, co chcesz osiągnąć. Nie ma potrzeby korzystania z zewnętrznych narzędzi. Wbudowane narzędzia Bash mogą wykonać zadanie za Ciebie.
Umożliwi to użycie flag, więc bez względu na kolejność przekazywania parametrów uzyskasz właściwe zachowanie.
Przykład:
Wynik :
Możesz dodać tę funkcję do swojego profilu lub umieścić ją w skrypcie.
Dzięki!
Edycja: Zapisz to jako plik, a następnie uruchom jako
yourfile.sh -last "Adios" -first "Hola"
źródło
./hello.sh DOSOMETHING -last "Adios" -first "Hola"
return 1;
z ostatniego przykładu danych wyjściowychcan only 'return' from a function or sourced script
w systemie macOS. Przejście doexit 1;
działa zgodnie z oczekiwaniami.Inną alternatywą byłoby użycie czegoś takiego jak w poniższym przykładzie, który pozwoliłby na użycie długich tagów --image lub short -i , a także pozwoliłby na skompilowanie -i = "example.jpg" lub oddzielne metody przekazywania argumentów -i example.jpg .
źródło
Najbardziej podoba mi się odpowiedź Roberta McMahana, ponieważ wydaje się, że najłatwiej jest zrobić z niej pliki do współużytkowania dla każdego ze skryptów. Ale wydaje się, że ma wadę, gdy wiersz
if [[ -n ${variables[$argument_label]} ]]
rzuca komunikat „zmienne: zły indeks tablicy”. Nie mam przedstawiciela, który mógłby komentować, i wątpię, aby to była poprawna poprawka, ale zawinięcie jejif
wif [[ -n $argument_label ]] ; then
to oczyszcza.Oto kod, na którym skończyłem. Jeśli znasz lepszy sposób, dodaj komentarz do odpowiedzi Roberta.
Dołącz plik „flags-declares.sh”
Dołącz plik „flags-arguments.sh”
Twój „script.sh”
źródło
Jeśli jesteś zaznajomiony z Pythonem Argparse i nie masz nic przeciwko wywoływaniu Pythona w celu przeanalizowania argumentów bash, istnieje kawałek kodu, który uważam za bardzo pomocny i bardzo łatwy w użyciu, zwany argparse-bash https://github.com/nhoffman/ argparse-bash
Przykład pobierz ze skryptu example.sh:
źródło
Proponuję prosty TLDR :; przykład dla niezainicjowanych.
Utwórz skrypt bash o nazwie helloworld.sh
Następnie możesz przekazać opcjonalny parametr
-n
podczas wykonywania skryptu.Wykonaj skrypt jako taki:
Wynik
Notatki
Jeśli chcesz użyć wielu parametrów:
while getops "n:" arg: do
o więcej parametrów, takich jakwhile getops "n:o:p:" arg: do
o) Option=$OPTARG
ip) Parameter=$OPTARG
źródło
Zapisz go jako sample.sh i spróbuj uruchomić
w twoim terminalu.
źródło
Miałem problem z użyciem getopts z wieloma flagami, więc napisałem ten kod. Wykorzystuje zmienną modalną do wykrywania flag i do używania tych flag do przypisywania argumentów do zmiennych.
Zauważ, że jeśli flaga nie powinna mieć argumentu, można zrobić coś innego niż ustawienie CURRENTFLAG.
źródło
Oto moje rozwiązanie. Chciałem móc obsługiwać flagi logiczne bez łącznika, z jednym łącznikiem i dwoma łącznikami, a także przypisywanie parametrów / wartości za pomocą jednego i dwóch łączników.
Niektóre referencje
declare
do$ bash -c "help declare"
.shift
do$ bash -c "help shift"
.źródło