Wszystko, co musisz wiedzieć o Bash For Loops w systemie Linux

Wszystko, co musisz wiedzieć o Bash For Loops w systemie Linux

Skrypty Bash są bardzo wydajnym sposobem automatyzacji zadań, zwłaszcza tych, które wykorzystują inne istniejące programy. Ta automatyzacja często wymaga kilkukrotnego powtórzenia podobnej operacji i właśnie tam dla pętli wchodzi w swoje własne.





Administratorzy systemów Linux i Mac są zwykle zaznajomieni ze skryptami za pomocą terminala, ale nawet użytkownicy Windows mogą weź udział w akcji dzięki podsystemowi Windows dla systemu Linux .





Jak działają skrypty Bash

Skrypt bash to po prostu zwykły plik tekstowy zawierający serię poleceń, które powłoka bash może odczytać i wykonać. Bash jest domyślną powłoką w systemie MacOS sprzed Catalina i większości dystrybucji Linuksa.





Jeśli nigdy wcześniej nie pracowałeś ze skryptem powłoki, powinieneś zacząć od absolutnie najprostszego przypadku. Pozwoli ci to przećwiczyć kluczowe koncepcje, w tym tworzenie skryptu i jego wykonanie.

Najpierw utwórz następujący plik w dogodnej lokalizacji (najlepiej otwórz terminal i najpierw przejdź do żądanego katalogu):



#!/bin/bash
echo 'Hello, World'

Pierwsza linia mówi każdemu, kto uruchamia ten program, jak go uruchomić (np. za pomocą interpretera bash). Drugi to po prostu polecenie, jak każde inne, które możesz wpisać w wierszu poleceń. Zapisz ten plik jako hello_world.sh , następnie:

$ chmod +x hello_world.sh
$ ./hello_world.sh

ten chmod polecenie w pierwszym wierszu czyni plik wykonywalnym, co oznacza, że ​​można go uruchomić wpisując jego nazwę, tak jak w drugim wierszu.





Jeśli widzisz słowa Hello, World wydrukowane w linii w terminalu, wszystko działa zgodnie z wymaganiami.

Jak działają pętle

W ogólnym programowaniu istnieją dwa główne typy pętli for: numeryczny oraz dla każdego . Tradycyjnie najpopularniejszy jest typ numeryczny, ale w przypadku basha zwykle jest odwrotnie.





Pętle numeryczne for zwykle skupiają się na pojedynczej liczbie całkowitej, która określa, ile iteracji zostanie wykonanych, na przykład:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Jest to znajomo wyglądająca pętla for, która iteruje dokładnie 100 razy, chyba że w pętli zostanie zmienione i lub inna instrukcja spowoduje zatrzymanie wykonywania pętli for.

W przeciwieństwie do tego, pętle foreach mają tendencję do operowania na strukturach, takich jak listy lub tablice, i iterują dla każdego elementu w tej kolekcji:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Niektóre języki używają nieco innej składni, która zamienia kolejność kolekcji i pozycji:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Dla w pętlach

W bashu foreach — lub dla w — pętla jest bardziej powszechna. Podstawowa składnia to po prostu:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Na przykład, aby przejść przez trzy jawnie nazwane pliki:

Windows 10 przenosi folder użytkownika na inny dysk
for file in one.c two.c three.c
do
ls '$file'
done

Jeśli takie pliki istnieją w bieżącym katalogu, wynikiem tego skryptu będzie:

one.c
two.c
three.c

Zamiast ustalonego zestawu plików, listę można uzyskać za pomocą wzorca glob (jeden zawiera symbole wieloznaczne – znaki specjalne reprezentujące inne znaki). W poniższym przykładzie pętla for iteruje po wszystkich plikach (w bieżącym katalogu), których nazwy kończą się na „.xml”:

for file in *.xml
do
ls -l '$file'
done

Oto kilka przykładowych wyników:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Może to wyglądać na rozwlekły sposób na zrobienie:

$ ls -l *.xml

Ale jest znacząca różnica: pętla for wykonuje ls zaprogramuj 2 oddzielne razy, za każdym razem przekazując do niego jedną nazwę pliku. W osobnym przykładzie ls wzorzec glob (*.xml) najpierw dopasowuje nazwy plików, a następnie wysyła je wszystkie jako indywidualne parametry wiersza polecenia do jednej instancji ls .

Oto przykład, który używa toaleta (liczba słów) program, aby różnica była bardziej oczywista:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

ten toaleta program zlicza liczbę wierszy w każdym pliku osobno, a następnie wypisuje łączną liczbę wszystkich z nich. Natomiast jeśli toaleta działa w pętli for:

for file in *.xml
do
wc -l $file
done

Nadal będziesz widzieć licznik dla każdego pliku:

44 feed.xml
231 sitemap.xml

Ale nie ma ogólnego podsumowania sumy, ponieważ toaleta jest uruchamiany w izolacji, za każdym razem, gdy pętla wykonuje iterację.

Kiedy lista nie jest listą

W przypadku pętli for występuje bardzo łatwy i powszechny błąd, wynikający ze sposobu, w jaki bash obsługuje cytowane argumenty/łańcuchy. Przeglądanie listy plików należy wykonać w następujący sposób:

for file in one.c two.c

Nie tak jak to:

for file in 'one.c two.c'

Drugi przykład obejmuje nazwy plików w podwójnych cudzysłowach, co skutkuje listą z tylko jednym parametrem; pętla for zostanie wykonana tylko raz. Tego problemu można uniknąć, używając zmiennej w takich przypadkach:

FILES='one.c two.c'
for file in $FILES
do
...
done

Zauważ, że sama deklaracja zmiennej musi zawierać swoją wartość w podwójnych cudzysłowach!

jak podnieść rękę na zoomie

Bez listy

Nie mając nic do iteracji, pętla for działa na dowolnych argumentach wiersza poleceń dostarczonych do skryptu po wywołaniu. Na przykład, jeśli masz skrypt o nazwie args.sh zawierające następujące elementy:

#!/bin/sh
for a
do
echo $a
done

Następnie wykonanie args.sh da ci następujące informacje:

$ ./args.sh one two three
one
two
three

Bash rozpoznaje ten przypadek i traktuje za zrobienie jako odpowiednik za w $@ do gdzie $@ jest specjalną zmienną reprezentującą argumenty wiersza poleceń.

Emulacja tradycyjnej liczby dla pętli

Skrypty basha często zajmują się listami plików lub wierszami danych wyjściowych innych poleceń, więc typ pętli for in jest powszechny. Jednak nadal obsługiwana jest tradycyjna operacja w stylu c:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Jest to klasyczna forma składająca się z trzech części, w których:

  1. zmienna jest inicjowana (i=1) przy pierwszym napotkaniu pętli
  2. pętla trwa tak długo, jak warunek (i<=5) is true
  3. za każdym razem wokół pętli zmienna jest zwiększana (i++)

Iteracja między dwiema wartościami jest na tyle powszechnym wymaganiem, że istnieje krótsza, nieco mniej myląca alternatywa:

for i in {1..5}
do
echo $i
done

Rozwijanie nawiasów skutecznie przekłada powyższą pętlę for na:

for i in 1 2 3 4

Lepsza kontrola pętli z przerwą i kontynuacją

Bardziej złożone pętle for często wymagają wcześniejszego wyjścia lub natychmiastowego ponownego uruchomienia głównej pętli z kolejną wartością. Aby to zrobić, bash pożycza przerwę i kontynuuj instrukcje, które są powszechne w innych językach programowania. Oto przykład, który używa obu do znalezienia pierwszego pliku, który ma więcej niż 100 znaków:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

Pętla for działa tutaj na wszystkich plikach w bieżącym katalogu. Jeśli plik nie jest zwykłym plikiem (np. jeśli jest katalogiem), instrukcja continue służy do ponownego uruchomienia pętli z kolejnym plikiem. Jeśli jest to zwykły plik, drugi blok warunkowy określi, czy zawiera więcej niż 100 znaków. Jeśli tak, instrukcja break służy do natychmiastowego wyjścia z pętli for (i dotarcia do końca skryptu).

Wniosek

Skrypt bash to plik zawierający zestaw instrukcji, które można wykonać. Pętla for umożliwia wielokrotne powtarzanie części skryptu. Za pomocą zmiennych, poleceń zewnętrznych oraz instrukcji break and continue skrypty bash mogą stosować bardziej złożoną logikę i realizować szeroki zakres zadań.

Udział Udział Ćwierkać E-mail Czy warto uaktualnić do systemu Windows 11?

Windows został przeprojektowany. Ale czy to wystarczy, aby przekonać Cię do przejścia z Windows 10 na Windows 11?

Czytaj dalej
Powiązane tematy
  • Programowanie
  • Linux
O autorze Bobby Jack(58 opublikowanych artykułów)

Bobby jest entuzjastą technologii, który przez prawie dwie dekady pracował jako programista. Pasjonuje się grami, pracuje jako redaktor recenzji w magazynie Switch Player i jest zanurzony we wszystkich aspektach publikowania online i tworzenia stron internetowych.

Więcej od Bobby'ego Jacka

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować