Pętle bash z przykładami
- 2691
- 296
- Maurycy Napierała
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
Idopó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
Przykłady pętli bash
- Zacznijmy od podstawowego
Do
pętla:
Kopiuj$ za i in $ (seq 1 5); echo $ i; Dane 1 2 3 4 5
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ątrzW
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:
Kopiuj$ seq 1 5 1 2 3 4 5
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:
KopiujTest $ CAT.txt 1 2 $ echo "$ (test CAT.txt | głowa -n1) "1
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:
Kopiuj$ if [„a” == „a”]; Następnie echo „Tak!"; fi tak!
Zwróć uwagę, jak ponownie
;
jest przedNastę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 zatemDo
LubJeśli
musi zostać zakończone przed następnym działaniem, które jest „następnie” w przykładzie instrukcji if iDo
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ą wI
zmienny ($ i
)
;: Zakończyć instrukcję echo (zakończ każde działanie)
zrobione: Wskaż, że to koniec naszej pętli - Weźmy ten sam przykład, ale napiszmy go inaczej:
Kopiuj$ za i w 1 2 3 4 5; echo $ i; Dane 1 2 3 4 5
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.
- Zwiększenie złożoności naszej pętli w celu uwzględnienia plików:
Kopiuj$ 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
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 wI
zmienna, jeden plik/dla każdej pętliDo
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śmy1.tekst
, śledzony przez2.tekst
itp.) i kot ten (wyświetl go) i weź pierwszą linię tego samegogłowa -n1
. Tak więc 5 razy1
jest wyjściowe, ponieważ jest to pierwszy wiersz we wszystkich 5 plikach, jak widzimy z poprzedniegogłowa -n1
we wszystkich .pliki txt. - A może teraz bardzo złożony?
Kopiuj$ 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 !
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 wW
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 drukujemy1
(Ostatnia linia w 1.txt) natychmiast następuje2
Do2.tekst
itp.
Jako sidenote, gdybyśmy nie określali polecenia obserwacyjnego echo, dane wyjściowe po prostu byłoby
12345
bez żadnych nowych linii:
Kopiuj$ za ja w $ (ls *.txt 2>/dev/null); echo -n "$ (ogon -n1 $ i)"; Zrobione 12345 $
Zauważ, że nawet ostatnia nowa linia nie jest obecna, stąd wyjście przed monitem
$
zwroty.Wreszcie mamy
echo "od $ i !";
(Pokazanie namod 1.tekst !
wyjście) i zamknięcie pętli przezzrobione
.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?
- Korzystanie z pętli w czasie, aby wygenerować losowy ciąg:
Kopiuj$ 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
To wygląda na złożone! Przeanalizujmy to krok po kroku. Ale najpierw zobaczmy, jak to zajmie się w skrypcie Bash.
- Przykład tej samej funkcjonalności, zaimplementowany w skrypcie Bash:
KopiujTest $ 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 "
$ 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 przezdata +%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: UstawLICZYĆ
zmienne do0
MyRandom = On line 7: UstawMyrandom
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, doprzerwa
Oświadczenie jest podane.
Count = $ [$ Count + 1] On line 10: Zwiększ naszeLICZYĆ
zmienna według1
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. KiedyLICZYĆ
jest więc większe10
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 echoLOSOWY
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ętli10
czasy w wynikuLICZYĆ
Sprawdzanie zmiennych kontrataków.Dlaczego więc wyjście jest często w formacie
1
,2
,3
i mniej innych liczb? To dlatego, żeLOSOWY
Zmienna zwraca zmienną półprzewodową (na podstawieLosowo =…
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 WSZYSTKO1
itp. Ponieważ pierwszy charakter wyjściowy jest zawsze przyjmowany przez SED! - 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
klauzulachwila
pętla również w następnym wierszu, aby stała się niepotrzebna, aby nawet używać;
Tam.
Kopiuj$ CAT TEST2.cii #!/bin/bash for i in $ (seq 1 3) echo "… zapętlanie… $ i…" gotowe
$ ./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.
- Na koniec spójrzmy na pętlę „do” do „do„
Kopiuj$ Nr = 0; do [$ nr -eq 5]; echo "$ nr"; Nr = $ [$ nr + 1]; Zrobione 0 1 2 3 4
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 naszeJeśli
stan lub lepszy naszdopó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 wJeśli
sprawozdania. W BASH polecenie testowe może być również reprezentowane przez pojedyncze[”]
wsporniki.$ Nr -eq 5
Środki testowe; Kiedy nasza zmiennaNr
osiągnie 5, a następnie test stanie się prawdziwy, z kolei tworzydopó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 WYKORZYSTYNr
Nr = $ [$ nr + 1];: Zwiększ naszą zmienną o jeden.$ ['…']
Metoda obliczeniowa jest specyficzna dla BASH
zrobione: Zakończ nasz kod łańcucha/pętli akcjiJak 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.
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