9 przykładów pętli for w skryptach Bash w Linuksie

Opublikowany: 2022-08-19
Linia poleceń systemu Linux na laptopie na niebieskim tle.
fatmawati achmad zaenuri/Shutterstock.com

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.

9 przykładów skryptów Bash, które pomogą Ci zacząć w systemie Linux
POWIĄZANE 9 przykładów skryptów Bash, które pomogą Ci zacząć w systemie Linux

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 

a dla pętli liczenia od 1 do 5

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 

liczenie pętli for poprzez niesekwencyjną listę liczb

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 

pętla for zliczająca nieposortowaną listę liczb

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 

Tworzenie skryptu wykonywalnego za pomocą chmod

Uruchommy skrypt.

 ./lista-słów.sh 

Pętla for działająca na liście słów

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 

Pętla for używająca zakresu liczb

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 

Pętla for z krokiem iteratora 4

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 

Pętla for używająca listy nazw plików

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 

Pętla for używająca wzorca pliku *.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 

Pętla for przyjmująca wzorzec pliku jako parametr wiersza poleceń

Możemy też przekazywać więcej niż jeden wzór na raz.

 ./filenames3.sh n*.sh .bashrc 

Pętla for pobierająca wzorzec pliku i parametry wiersza poleceń nazwy pliku

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 trójczłonowa lub C-podobna do pętli

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 

Pętla jak w C dla odliczania wstecz

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 

Nieskończona pętla for w stylu C

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 

Pętla for używająca tablicy słów

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 

Pętla for pomijająca wpis w tablicy słów z powodu polecenia continue

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 

Pętla for porzucająca dalsze przetwarzanie z powodu polecenia break

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.

Czym są słowniki Bash w systemie Linux i jak z nich korzystać?
Czym są słowniki Bash w systemie Linux i jak z nich korzystać?

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 

Używanie pętli for do wyodrębniania elementów z tablicy asocjacyjnej

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 

Używanie pętli for do iteracji po wyjściu dwóch poleceń potokowych

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ć.

Jak przetwarzać wiersz po wierszu w skrypcie Linux Bash?
POWIĄZANE Jak przetwarzać wiersz po wierszu w skrypcie Linux Bash

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.