Pętle bash z przykładami

Pętle bash z przykładami

Gotowy do zapętlania bash? Z popularnością Linuksa jako swobodnego systemu operacyjnego i uzbrojonego w moc interfejsu wiersza poleceń Bash, można przejść dalej, kodując zaawansowane pętle od wiersza poleceń lub w skryptach Bash.

Wykorzystując tę ​​moc, można manipulować dowolnym dokumentem, dowolnym zestawem plików lub zaimplementować zaawansowane algorytmy prawie każdego rodzaju i smaku. Jest mało prawdopodobne, aby napotkały wszelkie ograniczenia, jeśli używasz bash jako podstawy do skryptów, a pętle bash tworzą potężną część tego.

To powiedziawszy, pętle bash czasami mogą być trudne pod względem składni, a otaczająca wiedza jest najważniejsza. Dzisiaj prezentujemy z wami zestaw przykładów pętli bash, które pomogą ci szybko podnieść i stać się biegłym pętli bash! Zacznijmy!

W tym samouczku nauczysz się:

  • Jak Bash Do, chwila I dopóki Pętle oparte na przykładach
  • Jak Bash wymaga zakończenia stwierdzeń związanych z uruchomieniem pętli przed… Sekcja wykonana z pętli i jak odnosi się to do IF i innych stwierdzeń
  • Jak wdrożyć podstawowe i średnie zaawansowane pętle bash
  • Jak działają subshelly i jak można je stosować w deklaracjach zakresu pętli bash
  • Jak rozpocząć kodowanie pętli defensywnie, unikając błędów w wyjściu
  • Jak kodować Jedno-liniowe (wspólny termin używany wśród programistów Bash) w wierszu poleceń w porównaniu z tym samym kodem w skrypcie BASH
  • Jak ; Idiom składni jest ważną sprawą, jeśli chodzi o kodowanie pętli bash, zarówno na wierszu poleceń, jak i w skryptach
Bash Scripting - pętle bash z przykładami

Przykłady pętli bash

  1. Zacznijmy od podstawowego Do pętla:
    $ za i in $ (seq 1 5); echo $ i; Dane 1 2 3 4 5
    Kopiuj

    Jak widać, podstawowe Do Pętle w Bash są stosunkowo proste do wdrożenia. Oto kroki:

    Do: Wskazuje, że chcemy założyć nowy dla pętli opartej
    I: zmienna, której będziemy używać do przechowywania wartości generowanej przez klauzulę wewnątrz W Słowo kluczowe (mianowicie sekwencja tuż poniżej)
    $ (seq 1 5): To jest wykonywanie polecenia w innej podbrzeżu.

    Aby zrozumieć, jak to działa, rozważ ten przykład:

    $ seq 1 5 1 2 3 4 5
    Kopiuj

    Zasadniczo $ () Składnia może być używana ilekroć (i gdziekolwiek!) Chcesz założyć nową subshell. To jedna z najpotężniejszych cech skorupy bash. Rozważmy na przykład:

    Test $ CAT.txt 1 2 $ echo "$ (test CAT.txt | głowa -n1) "1
    Kopiuj

    Jak widać, tutaj Subshell wykonał „test CAT.txt | Head -n1 '(„Head -n1” wybiera tylko pierwszą linię), a następnie echem wyjście tej subshell.

    Kontynuujmy analizę naszych Pętli powyżej:

    ;: To jest bardzo ważne. W BASH każde „działanie”, na przykład na przykład „dla„ uruchamiania pętli, lub test instrukcji ”lub pętla itp. musi zostać zakończone „;”. Więc ';' jest tu * przed *, a nie później. Rozważ to bardzo podobne, jeśli przykład:

    $ if [„a” == „a”]; Następnie echo „Tak!"; fi tak!
    Kopiuj

    Zwróć uwagę, jak ponownie ; jest przed Następnie, nie później. Proszę, nie pozwól, aby to cię pomyliło podczas pisania lub podczas pętli, jeśli oświadczenia itp. Pamiętaj tylko, że każde działanie musi zostać zakończone przed jakimkolwiek nowym działaniem, a zatem Do Lub Jeśli musi zostać zakończone przed następnym działaniem, które jest „następnie” w przykładzie instrukcji if i Do w powyższej pętli!

    Wreszcie mamy:

    Do: Wskazując to Do co jest wcześniej … Do… Co nadchodzi dalej. Zwróć uwagę na to, że to słowo akcji jest po zamknięciu ; Służy do zamknięcia instrukcji otwierania pętli.
    echo $ i: Tutaj wyprowadzamy wartość przechowywaną w I zmienny ($ i)
    ;: Zakończyć instrukcję echo (zakończ każde działanie)
    zrobione: Wskaż, że to koniec naszej pętli

  2. Weźmy ten sam przykład, ale napiszmy go inaczej:
    $ za i w 1 2 3 4 5; echo $ i; Dane 1 2 3 4 5
    Kopiuj

    Możesz teraz zobaczyć, w jaki sposób odnosi się to do powyższego przykładu; To ten sam komentarz, choć tutaj nie użyliśmy subshell do wygenerowania dla nas sekwencji wejściowej, sami ręcznie określiliśmy.

    Czy to nie odkłada głowy z wyścigami o możliwych zastosowaniach? Więc powinno 🙂 Zróbmy teraz coś fajnego.

  3. Zwiększenie złożoności naszej pętli w celu uwzględnienia plików:
    $ ls 1.TXT 2.TXT 3.TXT 4.TXT 5.tekst
    Kopiuj
    $ head -n1 *.txt ==> 1.tekst <== 1 ==> 2.tekst <== 1 ==> 3.tekst <== 1 ==> 4.tekst <== 1 ==> 5.tekst <== 1 
    Kopiuj
    $ za ja w $ (ls *.tekst); DO CAT „$ i” | głowa -n1; wykonane 1 1 1 1 1
    Kopiuj

    Czy możesz ustalić, co się tutaj dzieje? Patrząc na nowe części tego dla pętli, widzimy:
    $ (ls *.tekst): Wymieśli to wszystkie pliki TXT w bieżącym katalogu i pamiętaj, że nazwa tych plików będzie przechowywana w I zmienna, jeden plik/dla każdej pętli Do Pętla przebiega.

    Innymi słowy, po raz pierwszy pojawia się pętla (część między a, $ i będzie zawierać 1.tekst. Następny bieg $ i będzie zawierać 2.tekst i tak dalej.

    Cat „$ i” | głowa -n1: Tutaj bierzemy $ i zmienna (jak to widzieliśmy 1.tekst, śledzony przez 2.tekst itp.) i kot ten (wyświetl go) i weź pierwszą linię tego samego głowa -n1. Tak więc 5 razy 1 jest wyjściowe, ponieważ jest to pierwszy wiersz we wszystkich 5 plikach, jak widzimy z poprzedniego głowa -n1 we wszystkich .pliki txt.

  4. A może teraz bardzo złożony?
     $ ogon -n1 *.txt ==> 1.tekst <== 1 ==> 2.tekst <== 2 ==> 3.tekst <== 3 ==> 4.tekst <== 4 ==> 5.tekst <== 5 
    Kopiuj
    $ za ja w $ (ls *.txt 2>/dev/null); echo -n "$ (ogon -n1 $ i)"; echo "od $ i !"; gotowe 1 od 1.tekst ! 2 z 2.tekst ! 3 z 3.tekst ! 4 z 4.tekst ! 5 z 5.tekst ! 
    Kopiuj

    Czy możesz ćwiczyć, co się tutaj dzieje?

    Przeanalizujmy to krok po kroku.

    bo ja : Wiemy już to; rozpocząć od nowa Do pętla, przypisz zmienną I do wszystkiego, co następuje w W klauzula
    $ (ls *.txt 2>/dev/null): To samo co powyższe polecenie; Wymień wszystkie pliki TXT, ale tym razem z nieco ostatecznej ochrony angażowania błędów. Patrzeć:

    $ za ja w $ (ls i.Do.nie.istnieć); echo „po prostu testowanie nieistnienia plików”; gotowe LS: Nie mogę uzyskać dostępu „i.Do.nie.istnieją ”: Brak takiego pliku ani katalogu 

    Niezbyt profesjonalny wynik! Zatem;

    $ za ja w $ (ls i.Do.nie.istnieją 2>/dev/null); echo „po prostu testowanie nieistnienia plików”; zrobione 

    Niniejsza instrukcja nie generuje żadnych danych wyjściowych.

    Kontynuujmy naszą analizę:

    ; Do: Zakończ instrukcję początkową dla pętli, rozpocznij sekcję DO… DODANY
    echo -n "$ (ogon -n1 $ i)";: Po pierwsze, -N oznacza nie wyjść z nowej linii na końcu żądanego wyjścia.

    Następnie bierzemy ostatni wiersz każdego pliku. Zwróć uwagę, w jaki sposób zoptymalizowaliśmy nasz kod z góry? I.mi. zamiast robić Plik CAT.txt | ogon -n1 można po prostu zrobić plik ogona -n1.tekst - stenograficzny, którego nowi programiści mogą łatwo przegapić. Innymi słowy, tutaj po prostu drukujemy 1 (Ostatnia linia w 1.txt) natychmiast następuje 2 Do 2.tekst itp.



    Jako sidenote, gdybyśmy nie określali polecenia obserwacyjnego echo, dane wyjściowe po prostu byłoby 12345 bez żadnych nowych linii:

    $ za ja w $ (ls *.txt 2>/dev/null); echo -n "$ (ogon -n1 $ i)"; Zrobione 12345 $
    Kopiuj

    Zauważ, że nawet ostatnia nowa linia nie jest obecna, stąd wyjście przed monitem $ zwroty.

    Wreszcie mamy echo "od $ i !"; (Pokazanie nam od 1.tekst ! wyjście) i zamknięcie pętli przez zrobione.

    Ufam już, jak to jest potężne i ile kontroli można wywierać na pliki, dokument i więcej!

    Wygenerujmy długi losowy ciąg z pewną pętlą! Zabawa?

  5. Korzystanie z pętli w czasie, aby wygenerować losowy ciąg:
    $ Random = "$ (data +%s%n | cut -B14-19)" $ count = 0; MyRandom =; choć prawda; do liczby = $ [$ count + 1]; jeśli [$ count -GT 10]; Potem przerwa; fi; MyRandom = "$ myRandom $ (echo" $ losy "| sed 's |^\ (.\).*| \ 1 | ') "; done; echo" $ myRandom "6421761311
    Kopiuj

    To wygląda na złożone! Przeanalizujmy to krok po kroku. Ale najpierw zobaczmy, jak to zajmie się w skrypcie Bash.

  6. Przykład tej samej funkcjonalności, zaimplementowany w skrypcie Bash:
    Test $ CAT.cii #!/bin/bash random = "$ (data +%s%n | cut -B14-19)" Count = 0 myRandom = when true; do liczby = $ [$ count + 1], jeśli [$ count -GT 10]; Następnie Break fi myRandom = "$ MyRandom $ (echo" $ land land "| sed 's |^\ (.\).*| \ 1 | ') "DODOCE ECHO" $ MyRandom "
    Kopiuj
    $ chmod +x test.sh $ ./test.SH 1111211213 $ ./test.SH 1212213213 

    Czasami jest to dość zaskakujące, że tak złożonego kodu pętli bash można tak łatwo przenieść do „jedno-liniowej” (termin, którego programiści Bash używają, aby odnosić się do rzeczywistości małego skryptu, ale zaimplementowanego bezpośrednio z wiersza poleceń, zwykle w a pojedyncze (lub maksymalnie kilka) linii.



    Zacznijmy teraz analizować nasze dwa ostatnie przykłady - które są bardzo podobne. Niewielkie różnice w kodzie, szczególnie wokół idiomu „;” są wyjaśnione w Przykład 7 poniżej:

    Random = "$ (data +%s%n | cut -b14-19)" On line 4: To wymaga (używając CUT -B14-19) Ostatnie 6 cyfr obecnego czasu epoki (liczba sekund, które minęły od 1 stycznia 1970 r.), Jak donosi przez data +%s%n i przypisuje ten wygenerowany ciąg do zmiennej losowej, tym samym ustawiając półprzezroczystą entropię do losowej puli, w prostym kategoriach „czyniąc losową pulę losową”.
    Count = 0 On line 6: Ustaw LICZYĆ zmienne do 0
    MyRandom = On line 7: Ustaw Myrandom zmienna do „pustej” (bez przypisanej wartości)
    podczas gdy… gotowe Między wierszem 9 a linią 15: Powinno to być teraz jasne; Rozpocznij pętlę, uruchom kod między DO… wykonane klauzule.
    PRAWDA: i tak długo, jak stwierdzenie, które następuje po „While”, jest oceniane jako prawdziwe, pętla będzie kontynuowana. Tutaj stwierdzenie jest „prawdziwe”, co oznacza, że ​​jest to nieokreślona pętla, do przerwa Oświadczenie jest podane.
    Count = $ [$ Count + 1] On line 10: Zwiększ nasze LICZYĆ zmienna według 1
    jeśli [$ count -GT 10]; Następnie On line 11: Instrukcja IF, aby sprawdzić, czy nasza zmienna jest większa niż -GT 10, A jeśli tak, to… Wówczas… fi część
    przerwa On line 12: To złamie nieokreślone podczas pętli (i.mi. Kiedy LICZYĆ jest więc większe 10 pętla się skończy)
    MyRandom = "… on wiersz 14: zamierzamy przypisać nową wartość Myrandom
    $ Myrandom On line 14: Po pierwsze, weź to, co już mamy w tej zmiennej, innymi słowy, dołączymy coś na końcu tego, co już tam jest, i to dla każdej kolejnej pętli
    $ (echo "$ land land" | sed 's |^\ (.\).*| \ 1 | ') On line 14: To część dodawana za każdym razem. Zasadniczo to echo LOSOWY zmienna i przyjmuje pierwszy charakter tego wyjścia za pomocą złożonego wyrażenia regularnego w SED. Możesz zignorować tę część, jeśli chcesz, w zasadzie stwierdza „weź pierwszą postać $ Losowe zmienne wyjście i odrzuć wszystko inne ”

    Możesz zatem zobaczyć, w jaki sposób wyjście (na przykład 1111211213) jest wygenerowany; Jedna postać (lewej do prawej) w tym czasie, za pomocą pętli When, która pętli 10 czasy w wyniku LICZYĆ Sprawdzanie zmiennych kontrataków.

    Dlaczego więc wyjście jest często w formacie 1,2,3 i mniej innych liczb? To dlatego, że LOSOWY Zmienna zwraca zmienną półprzewodową (na podstawie Losowo =… nasiona), które znajduje się w zakresie od 0 do 32767. Tak więc często liczba ta rozpocznie się od 1, 2 lub 3. Na przykład 10000-19999 WSZYSTKO 1 itp. Ponieważ pierwszy charakter wyjściowy jest zawsze przyjmowany przez SED!

  7. Krótki skrypt, który podkreśla możliwość zorganizowania (lub stylowego) kodu zapętlania bashu w inny sposób bez użycia ; idiom.

    Musimy wyjaśnić niewielkie różnice skryptu Bash w porównaniu do skryptu wiersza poleceń jednolinowych.

    NOTATKA
    Zauważ, że w skrypcie Bash (test.sh) Nie ma tak wielu ; frazeologia. Dzieje się tak, ponieważ teraz podzieliliśmy kod na wiele linii i ; Jest nie Wymagane, gdy istnieje postać EOL (koniec linii). Taka postać (nowa linia lub powrót powozu) nie jest widoczny w większości edytora tekstu, ale jest to samo wyjaśniające, jeśli myślisz o fakcie, że każde polecenie znajduje się w osobnej linii.

    Zauważ też, że możesz umieścić Do klauzula chwila pętla również w następnym wierszu, aby stała się niepotrzebna, aby nawet używać ; Tam.

    $ CAT TEST2.cii #!/bin/bash for i in $ (seq 1 3) echo "… zapętlanie… $ i…" gotowe
    Kopiuj
    $ ./test2.sh… zapętlanie… 1… zapętlanie… 2… zapętlanie… 3… 

    Osobiście wolę styl składniowy podany w Przykład 6, Ponieważ wydaje się to jasne, czym jest zamiar kodu, pisząc instrukcję pętli w pełni w jednym wierszu (zarówno do innych języków kodowania), chociaż opinie i style składni różnią się według programisty lub społeczność programistów.

  8. Na koniec spójrzmy na pętlę „do” do „do„
    $ Nr = 0; do [$ nr -eq 5]; echo "$ nr"; Nr = $ [$ nr + 1]; Zrobione 0 1 2 3 4
    Kopiuj

    Przeanalizujmy ten przykład:

    Nr = 0: Tutaj ustaw zmienną wymienioną Nr, do zera
    dopóki: Rozpoczynamy naszą pętlę „do”
    [$ Nr -eq 5]: To jest nasze Jeśli stan lub lepszy nasz dopóki stan. mówię Jeśli Ponieważ składnia (i działająca) jest podobna do składania polecenia testowego, i.mi. polecenie podkładu, które jest używane w Jeśli sprawozdania. W BASH polecenie testowe może być również reprezentowane przez pojedyncze [”] wsporniki. $ Nr -eq 5 Środki testowe; Kiedy nasza zmienna Nr osiągnie 5, a następnie test stanie się prawdziwy, z kolei tworzy dopóki koniec pętli, gdy warunek jest dopasowany (innym sposobem na przeczytanie tego jest „aż do prawdziwego” lub „dopóki nasza zmienna NR nie będzie równa 5”). Należy zauważyć, że po 5, kod pętli nie jest już wykonywany, więc 4 to ostatni wyświetlany numer.
    ;: Zakończ nasze do oświadczenia, jak wyjaśniono powyżej
    Do: Rozpocznij nasz łańcuch działania, który zostanie wykonany, dopóki testowana instrukcja stanie się prawdziwa/ważna
    echo „$ nr;”: Echo OKRUKUJ WYKORZYSTY Nr
    Nr = $ [$ nr + 1];: Zwiększ naszą zmienną o jeden. $ ['…'] Metoda obliczeniowa jest specyficzna dla BASH
    zrobione: Zakończ nasz kod łańcucha/pętli akcji

    Jak widać, podczas gdy pętle nie będą bardzo podobne, choć w rzeczywistości są przeciwieństwami. Podczas gdy pętle wykonują tak długo, jak coś jest prawdziwe/prawidłowe, podczas gdy dopóki pętle nie będą wykonywać, dopóki coś nie jest „jeszcze ważne/prawdziwe”. Często są wymienne poprzez odwrócenie stanu.

  9. Wniosek

    Ufam, że możesz zacząć widzieć moc Basha, a zwłaszcza za, a i do momentu, gdy pętle bash. Tylko porysowaliśmy tutaj powierzchnię, a ja mogę wrócić później z kolejnymi zaawansowanymi przykładami. W międzyczasie zostaw nam komentarz na temat tego, jak korzystasz z pętli bash w codziennych zadaniach lub skryptach. Cieszyć się!

Powiązane samouczki Linux:

  • Zagnieżdżone pętle w skryptach Bash
  • Mastering Bash Script Loops
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wielokrotyściowe skrypty i zarządzanie procesami w…
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Obsługa danych wejściowych użytkownika w skryptach Bash
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Rzeczy do zainstalowania na Ubuntu 22.04