Jak używać getopts do analizowania opcji skryptu

Jak używać getopts do analizowania opcji skryptu

Cel

Dowiedz się, jak korzystać z bash getopts Zbudowany, aby analizować opcje skryptu

Wersje systemu operacyjnego i oprogramowania

  • System operacyjny: - Wszystkie dystrybucje Linux

Wymagania

  • Brak specjalnych wymagań, tylko dostęp do skorupy bash

Trudność

ŚREDNI

Konwencje

  • # - Wymaga podanych poleceń Linuksa, które można wykonać z uprawnieniami root
    bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
  • $ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wstęp

Modyfikacja zachowania skryptu BASH za pomocą opcji czasu wykonywania, podobnie jak zwykle z programami wiersza poleceń, może być bardzo przydatne. Shell Bash zapewnia getopts Wbudowane polecenie, standardowy sposób na osiągnięcie tego. Jak go używać, nauczymy się w tym samouczku.

Tworzenie naszego skryptu testów

Na potrzeby tego samouczka stworzymy skrypt testowy i, z dużą ilością fantazji, nazwiemy to test.cii. Celem tego skryptu będzie wyświetlenie czegoś w zależności od opcji, którą zapewniamy (nie będzie to najbardziej użyteczny skrypt na świecie, ale wystarczy wyjaśnić, jak to działa).

Otwórzmy nasz edytor tekstu i zacznijmy:

#!/bin/bash Set -e Set -u Set -o PipeFail 

Dostarczone opcje powłoki na początku scenariuszy nie są obowiązkowe, ale dobre nawyk jest używać ich w każdym skrypcie, który piszemy. W skrócie, -mi, krótki Errexitmodyfikuje zachowanie powłoki, które wychodzi z powodu, gdy polecenie wyjdzie ze statusem non zero (z pewnymi wyjątkami). -u to kolejna bardzo ważna opcja: sprawia, że ​​skorupa traktuje niezdefiniowane zmienne jako błędy.

Wreszcie PUREFAIL zmienia sposób, w jaki polecenia w rurze są oceniane. Status wyjścia rury będzie statusem najwyższego polecenia, aby wyjść z statusem non zero, lub zero, jeśli wszystkie programy w rurze zostaną pomyślnie wykonywane. Innymi słowy, rura zostanie uznana za skuteczną, jeśli wszystkie zaangażowane polecenia zostaną wykonywane bez błędów.



Konstrukcja getopts

Po tej krótkiej dygresji wróćmy do głównego punktu tego samouczka i zobaczmy, jak getopts Pracuje:

#!/bin/bash set -e set -u Set -o PipeFail, a getopts 'lha:' opcja; zrób „$ opcja” w l) echo „LinuxConfig” ;; h) echo „H oznacza h” ;; a) avalue = "$ optarg" echo "dostarczona wartość to $ optarg" ;; ?) Echo „Zastosowanie skryptu: $ (nazwa podstawy \ $ 0) [-l] [-h] [-a Somevalue]”> i 2 wyjście 1 ;; ESAC DODAK SHIFT „$ (($ optind -1))” 

Przeanalizujmy, co mamy powyżej. Przede wszystkim getopts Polecenia muszą być używane wewnątrz chwila pętla, więc wszystkie opcje są analizowane. Następnie natychmiast po getopts Słowo kluczowe, zdefiniowaliśmy możliwe opcje, które zaakceptuje nasz skrypt. Oni są L, H i w końcu A.

Co oznacza okrężnica po tej ostatniej opcji? To sposób, w jaki informujemy getopts, że opcja wymaga argumentu. Każda opcja przeanalizowana będzie przechowywana wewnątrz $ Opcja zmienna, podczas gdy argument, gdy jest obecny, stanie się wartością$ Optarg jeden.

Każda opcja jest zarządzana w instrukcji sprawy, z ostatecznym ? przypadek, który będzie dopasowany, gdy zostanie dostarczona opcja, która nie istnieje. W takim przypadku po prostu odzwierciedlmy użytkownika poprawne użycie skryptu i wyjdziemy z kodu błędu.

Testowanie naszego skryptu

Najpierw nazwiemy nasz skrypt, zapewniając nie istniejącą opcję, aby przetestować przypadek, o którym wspomniano powyżej. Podajmy skrypt uprawnienia wykonywalne, a następnie nazwijmy go:

Test CHMOD +X.cii && ./Tesh.sh -c 

Zgodnie z oczekiwaniami otrzymamy wiadomość z informacją, że dostarczona opcja jest nielegalna, a następnie instrukcje dotyczące korzystania z skryptu:

./test.SH: Nielegalna opcja - C Użycie skryptu: Test.sh [-l] [-h] [-a Somevalue] 

Podczas Wykorzystanie skryptu String to ten, który ustawiliśmy do wydrukowania na błędach użytkowania, powyżej, jest to komunikat automatycznie generowany przez getopts i można go wyłączyć, poprzedzając opcje :. Zobaczmy teraz, co się stanie, gdy używamy skryptu tak, jak miało to na celu:



./test.sh -l Linuxconfig 

Użyliśmy L opcja, a skrypt wydrukowany na ekranie String, który ustawiamy w odpowiednim przypadku, właśnie tak się stanie, jeśli dostarczymy -H opcja:

./test.sh -h h oznacza h 

Spróbujmy teraz wywołać skrypt z A opcja. Jak wspomniano powyżej, ta opcja wymaga argumentu i zawiedzie, jeśli ten ostatni nie zostanie dostarczony:

./test.sh -a ./test.SH: Opcja wymaga argumentu - użycie skryptu: test.sh [-l] [-h] [-a Somevalue] 

Zgodnie z oczekiwaniami skrypt odpowiedział komunikatem o błędzie, przypominając nam, że podana przez nas opcja wymaga argumentu:

./test.SH -a TUX Dostarczona wartość to smoking 

Tym razem skrypt odpowiedział bez błędu. Zwróć uwagę, jak przekazaliśmy argument, smoking jest wydrukowany, ponieważ staje się wartością $ Optarg zmienny.

Za pomocą getopts, Możesz podać także więcej niż jedną opcję w tym momencie do skryptu, łącząc flagi podczas jej uruchomienia. Na przykład zobaczmy, co się stanie, gdy próbujemy wywołać nasze skrypty za pomocą obu L I H Opcje:

./test.sh -lh linuxconfig h oznacza h 

Jak możemy zauważyć, obie opcje zostały przetworzone, w kolejności im zapewniliśmy. Z przekleństwa opcje można podać osobno, a my możemy również dodać A opcja, ale zawsze pamiętam, aby dodać wymagany argument:

./test.sh -L -h -a Tux_rulez Linuxconfig H oznacza H Dostarczona wartość to Tux_rulez 

Zmienna $ optind

Jeśli spojrzymy na bardzo trywialny skrypt, który napisaliśmy powyżej, widzimy kolejną instrukcję na końcu pętli While: Shift $ (($ optind -1)). Jaki jest jego cel? Powiedzmy, że w ten sposób nazywamy scenariusz:

./test.sh -l -h -a hello świat 

Po wywołaniu skryptu, $ Optind Zmienna jest ustawiona na 1 i jest zwiększana za każdym razem, gdy opcja jest analizowana, dopóki nie osiągnie ostatniego. Dlatego w tym przypadku będzie miał wartość 5, gdy dotrze do ostatniego elementu, czyli Witam, obowiązkowy argument wymagany przez -A opcja.

zmiana jest wbudowaną skorupą, która przesuwa parametry pozycyjne skryptu w dół określonej liczby podanych mu jako liczba dodatnich, odrzucając powiązane argumenty.

Sposób, w jaki uruchomiliśmy powyższy skrypt, ostatni podany argument „świat”, nie jest przeanalizowany przez getopts, który w tym momencie już zakończył swoją pracę.

Teraz, jeśli dokonamy zmiany wartości $ Optind - 1 (To jest efektywna liczba opcji przeanalizowanych, 4 W tym przypadku) w parametrach pozycyjnych, to, co pozostaje, to tylko argumenty, które nie są opcjami, w tym przypadku „świat”, do których możemy uzyskać dostęp, korzystając $* Zmienna później w tym skrypcie.

Powiązane samouczki Linux:

  • Skrypt bash: Wykorzystanie flag z przykładami argumentów
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Jak wykonywać operacje administracyjne z Ansible…
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Polecenia Linux: Top 20 najważniejsze polecenia, które musisz…
  • Podstawowe polecenia Linux
  • Linux Pliki konfiguracyjne: Top 30 Najważniejsze
  • Pobierz Linux
  • Jak wydrukować drzewo katalogu za pomocą Linux
  • Czy Linux może uzyskać wirusy? Badanie podatności Linuksa…