9 przykładów pętli for w skryptach Bash w Linuksie
Opublikowany: 2022-08-19
Wszechstronna pętla Bash for
robi znacznie więcej niż zapętlenie określonej liczby razy. Opisujemy jego wiele wariantów, abyś mógł z powodzeniem używać ich we własnych skryptach linuksowych.
Pętla for
Wszystkie języki skryptowe i programowania mają pewien sposób obsługi pętli. Pętla to sekcja kodu, którą chcesz wykonywać wielokrotnie. Zamiast wpisywać ten sam zestaw instrukcji do skryptu, pętla będzie powtarzać w kółko jedną sekcję kodu.
Pętla Bash for
jest bardzo elastyczna. Może pracować z liczbami, słowami, tablicami, zmiennymi wiersza poleceń lub danymi wyjściowymi innych poleceń. Są one używane w nagłówku pętli. Nagłówek dyktuje, z czym pracuje pętla — na przykład liczby lub łańcuchy — i jaki jest warunek zakończenia, który zatrzyma pętlę.
Treść pętli zawiera kod, który chcesz powtórzyć. Zawiera to, co chcesz, aby pętla zrobiła . Treść pętli może zawierać dowolne prawidłowe polecenie skryptu.
Zmienna zwana licznikiem pętli lub iteratorem służy do przechodzenia przez zakres wartości lub listę elementów danych. Dla każdej pętli iterator przyjmuje wartość następnej liczby, ciągu lub dowolnego typu danych, nad którym iteruje pętla. Pozwala to pętli na pracę z wartościami każdego elementu danych po kolei, a nawet w niektórych przypadkach na manipulowanie samymi elementami danych.
Proste dla pętli
Jeśli chcesz napisać swoją pierwszą pętlę for, te proste przykłady pomogą Ci zacząć.
dla pętli przy użyciu list numerycznych
Możesz uruchomić pętlę for
w wierszu poleceń. To polecenie tworzy i wykonuje prostą pętlę for
. Iterator to zmienna o nazwie i
. Po kolei przypiszemy i
do każdej z wartości na liście liczb. Ciało pętli wypisze tę wartość w oknie terminala. Warunkiem, który kończy tę pętlę i
jest iteracja całej listy liczb.
dla i w 1 2 3 4 5; wykonaj echo $i; Gotowe
Należy tutaj zauważyć, że zmienna i
jest zwiększana o jeden za każdym razem, gdy pętla się obraca, ale to dlatego, że lista liczb zwiększa się za każdym razem o jeden.
Ta lista liczb zaczyna się od 3 i rośnie w krokach po dwa, a następnie arbitralnie przeskakuje do 44.
dla i w 3 5 7 9 11 44; wykonaj echo $i; Gotowe
W przypadku pętli for
nie ma to żadnego znaczenia. Rozpoczyna się na jednym końcu listy i używa kolejno każdej wartości, aż wszystkie wartości z listy zostaną użyte.
Liczby nie muszą być również w porządku rosnącym. Mogą być w dowolnej kolejności.
dla i w 3 43 44 11 9; wykonaj echo $i; Gotowe
dla pętli przy użyciu list słów
Równie łatwo możemy zrobić to samo ze słowami. Skopiuj tekst skryptu do edytora i zapisz go jako „word-list.sh”.
#!/kosz/bash for word in To jest sekwencja słów robić echo $słowo Gotowe
Będziesz musiał użyć chmod
, aby skrypt był wykonywalny, i każdy inny skrypt, który skopiujesz z tego artykułu. Po prostu podmieniaj nazwę skryptu za każdym razem, gdy używasz polecenia chmod
.
chmod +x lista-słów.sh
Uruchommy skrypt.
./lista-słów.sh
Podobnie jak w przypadku liczb, iterator — w tym przykładzie word
zmienne — przechodzi przez listę elementów danych, aż dotrze do końca listy. Treść pętli uzyskuje dostęp do wartości w zmiennej word
, więc każde słowo na liście jest przetwarzane.
dla pętli z zakresami numerów
Jeśli chciałbyś, aby pętla for
działała 100 razy, byłoby dość męczącą sprawą wpisywanie sekwencji 100 liczb w nagłówku pętli. Zakresy numerów pozwalają określić tylko pierwszą i ostatnią liczbę.
Ten skrypt to „number-range.sh”.
#!/kosz/bash dla mnie w {1..10} robić echo "Obrót pętli:" $i Gotowe
Zakres liczb jest zdefiniowany w nawiasach klamrowych „ {}
” z dwoma kropkami „ ..
” oddzielającymi liczby rozpoczynające i kończące zakres. Upewnij się, że definicja zakresu nie zawiera spacji.
Tak to działa:
./zakres-liczb.sh
Możesz dołączyć inną liczbę, która definiuje rozmiar kroku, którego powinien używać iterator, aby przejść przez liczby w zakresie. Ten skrypt „number-range2.sh” będzie używał zakresu od 0 do 32 i rozmiaru kroku 4.
#!/kosz/bash dla mnie w {0..32..4} robić echo "Obrót pętli:" $i Gotowe
Iterator przechodzi przez zakres liczb w skokach po cztery.
./zakres-liczb2.sh
dla pętli używających nazw plików
Ponieważ możemy przetwarzać listy słów, możemy sprawić, by nasze skrypty działały z nazwami plików. Ten skrypt nazywa się „filenames.sh”.
#!/kosz/bash dla pliku w word-list.sh number-range.sh number-range2.sh nazwy plików.sh robić ls -lh "$plik" Gotowe
Byłoby całkiem bezcelowe mieć skrypt, który robi tylko to, co może zrobić ls
, ale pokazuje, jak uzyskać dostęp do nazw plików w ciele pętli.
./nazwy plików.sh
W podobny sposób, jak przy użyciu zakresu numerów, możemy użyć wzorca pliku w nagłówku pętli, aby określić pliki, które chcemy przetworzyć. Pozwala to uniknąć pisania i oznacza, że nie musimy znać z góry nazw plików.
Ten skrypt nazywa się „filenames2.sh”. Zamieniliśmy listę nazw plików na wzorzec nazwy pliku „*.sh”, aby raport skryptu dotyczył wszystkich plików skryptów w bieżącym katalogu.
#!/kosz/bash dla pliku w *.sh robić ls -lh "$plik" Gotowe
Oto wynik.
./filenames2.sh
dla pętli przy użyciu parametrów wiersza poleceń
Możemy dodać trochę większej elastyczności, przekazując wzorzec nazwy pliku w wierszu poleceń. Zmienna $*
reprezentuje wszystkie parametry wiersza poleceń przekazane do skryptu.
To jest „filenames3.sh”.
#!/kosz/bash dla pliku w $* robić ls -lh "$plik" Gotowe
Poprosimy o nazwy plików, które zaczynają się od „n” i mają rozszerzenie SH.
./pliki3.sh n*.sh
Możemy też przekazywać więcej niż jeden wzór na raz.
./filenames3.sh n*.sh .bashrc

file
zmiennej iteratora przyjmuje wartość każdego z parametrów wiersza poleceń. Wzorce nazw plików są rozwijane, a wszystkie nazwy plików są przetwarzane w ciele pętli.
POWIĄZANE: Jak pracować ze zmiennymi w Bash
C-jak dla pętli
Bash obsługuje klasyczną trójskładnikową pętlę for, taką jak te, które można znaleźć w języku programowania C. Nazywa się je trójskładnikowymi pętlami for, ponieważ w nagłówku pętli znajdują się trzy terminy.
- Początkowa wartość iteratora pętli.
- Test, czy pętla jest kontynuowana, czy kończy się.
- Inkrementacja — lub dekrementacja — iteratora.
Ten skrypt to „c-like.sh”.
Iterator I
jest ustawiony na 1 na początku pętli, a pętla będzie działać tak długo, jak długo wyrażenie „ i<=10
” będzie prawdziwe. Jak tylko i
11, pętla for
się zatrzyma. Iterator jest zwiększany o jeden przy każdym obrocie pętli.
#!/kosz/bash dla (( i=1; i<=10; i++ )) robić echo "Numer pętli:" $i Gotowe
Uruchommy ten skrypt.
./c-jak.sh
Pętla for
podobna do C pozwala na łatwe tworzenie pętli for
, które mają nieco dziwne wymagania. Ta pętla zaczyna się od 15 i odlicza wstecz w krokach po 3. To jest „c-like2.sh”
#!/kosz/bash dla (( i=15; i>0; i-=3 )) robić echo "Numer pętli:" $i Gotowe
Kiedy go uruchomimy, powinien odskoczyć w krokach po trzy.
./c-jak2.sh
Nieskończone dla pętli
Możesz również użyć tego formatu pętli for
, aby utworzyć nieskończoną pętlę. Wszystko, co musisz zrobić, to usunąć wszystkie elementy z nagłówka pętli, w ten sposób. To jest „infinite.sh”.
#!/kosz/bash dla (( ; ; )) robić echo "Naciśnij Ctrl+C, aby zatrzymać..." spać 1 Gotowe
Aby zatrzymać pętlę, musisz nacisnąć Ctrl+C.
./nieskończony.sh
dla pętli używających tablic słów
Możemy łatwo iterować po tablicy słów. Musimy podać nazwę tablicy w nagłówku pętli, a iterator przejdzie przez wszystkie wpisy w tablicy. To jest „word-array.sh”.
#!/kosz/bash dystrybucje=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") dla dystrybucji w $distributions robić echo $distro Gotowe
Wszystkie dystrybucje są dla nas wymienione.
./tablica-slow.sh
Kontynuuj polecenie
Jeśli chcesz, aby pętla przechodziła przez określony wpis, sprawdź, czy iterator pasuje do tego wpisu i użyj polecenia continue
. Polecenie continue
porzuca bieżący obrót pętli. Zwiększa iterator i rozpoczyna następny obrót pętli — zakładając, że wpis, który chcesz pominąć, nie jest ostatnią pozycją na liście.
To jest „word-array2.sh”. Przechodzi przez wpis tablicy „Arch”, ale przetwarza wszystkie inne elementy tablicy.
#!/kosz/bash dystrybucje=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") dla dystrybucji w $distributions robić if [[ "$distro" == "Łuk" ]] ; następnie kontynuować fi echo $distro Gotowe
„Arch” nie pojawia się w oknie terminala.
./tablica-slow2.sh
Polecenie przerwania
Polecenie break
wychodzi z pętli i zapobiega dalszemu przetwarzaniu.
To jest „word-array3.sh”. Jest to to samo co w poprzednim skrypcie, gdzie continue
zastąpiono przez break
.
#!/kosz/bash dystrybucje=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") dla dystrybucji w $distributions robić if [[ "$distro" == "Łuk" ]] ; następnie przerwanie fi echo $distro Gotowe
Gdy iterator zawiera „Arch”, pętla for porzuca dalsze przetwarzanie.
./tablica-slow3.sh
dla pętli przy użyciu tablic asocjacyjnych
W Bash 4 i nowszych tablice asocjacyjne umożliwiają tworzenie list par klucz-wartość, które można przeszukiwać według klucza lub według wartości. Ze względu na dwukierunkową relację między kluczem a wartością są one również nazywane słownikami danych.
Możemy iterować po tablicy asocjacyjnej za pomocą pętli for
. Ten skrypt to „associative.sh”. Definiuje tablicę asocjacyjną z czterema wpisami, po jednym dla każdego z „pies”, „kot”, „robin” i „człowiek”. To są klucze. Wartości to (domyślna) liczba nóg, które każdy z nich ma.
#!/kosz/bash zadeklaruj -A zwierzęta=( [pies]=Czworonożny [kot]=Czteronożny [robin]=Dwunożny [człowiek]=Dwunożny ) na nogi u ${!zwierząt[@]} robić if [ ${zwierzęta[$nogi]} == "Dwunogi" ]; następnie echo ${legs} fi Gotowe
Iterator nazywa się legs
. Zauważ, że nagłówek pętli zawiera „ !
" wykrzyknik. To nie działa jako logiczny operator NOT, jest częścią składni tablicy asocjacyjnej. Wymagane jest przeszukanie tablicy.
Treść pętli wykonuje test porównania ciągów. Jeśli wartość elementu tablicy to „Dwunożny”, wyświetla wartość klucza w oknie terminala. Kiedy go uruchamiamy, skrypt wyświetla dwunożne stworzenia.
./skojarzenie.sh
Iteracja na wyjściu poleceń
Jeśli masz polecenie lub sekwencję poleceń, które tworzą listę czegoś, na przykład nazwy plików, możesz je iterować za pomocą pętli for
. Musisz uważać na nieoczekiwane rozszerzenia nazw plików, ale w prostych przypadkach jest to w porządku.
Ten skrypt to „command.sh”. używa ls
i wc
, aby dostarczyć posortowaną listę nazw plików skryptowych, wraz z ich liczbą wierszy, słów i bajtów.
#!/kosz/bash dla i w $(ls *.sh | sort); robić echo $(wc $i) Gotowe
Po uruchomieniu otrzymujemy statystyki dla każdego pliku, z plikami wymienionymi w kolejności alfabetycznej.
./polecenie.sh
Olśniewająca pętla
Pętla for
jest wszechstronnym i łatwym do zrozumienia narzędziem skryptowym. Ale tak elastyczny jak to jest, nie zapominaj, że inne pętle istnieją z jakiegoś powodu. Nie daj się zwieść myśleniu, że pętla for
jest wszystkim, czego kiedykolwiek będziesz potrzebować.
Na przykład pętla while
znacznie lepiej nadaje się do pewnych rzeczy niż pętla for
, na przykład do czytania wierszy z pliku.
Pisanie dobrych skryptów oznacza używanie najbardziej odpowiedniego narzędzia do danego zadania. Pętla for
to świetne narzędzie, które możesz mieć w swoim zestawie sztuczek.