Skrypty Bash są bardzo wydajnym sposobem automatyzacji zadań, szczególnie tych, które wykorzystują inne istniejące programy. Ta automatyzacja często wymaga kilkukrotnego powtórzenia podobnej operacji, czyli właśnie tam dla pętli przychodzi sama.
Administratorzy systemów Linux i Mac zwykle znają skrypty za pośrednictwem terminala, ale nawet użytkownicy systemu Windows to potrafią weź udział w akcji dzięki podsystemowi Windows dla systemu Linux.
Potrzebujesz szybko skorzystać z Linuksa, aby przejść na inny komputer lub uruchomić maszynę wirtualną? Zamiast tego uruchom Linuksa w Windows 10 z terminalem powłoki Bash!
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 to domyślna powłoka w macOS przed 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 pojęcia, 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 „Witaj świecie”
Pierwsza linia mówi cokolwiek uruchamia ten program, jak go uruchomić (tj. Używając interpretera bash). Druga to po prostu polecenie, jak każde inne, które można wprowadzić w wierszu poleceń. Zapisz ten plik jako hello_world.sh, następnie:
$ chmod + x hello_world.sh
$ ./hello_world.sh
Plik chmod polecenie w pierwszej linii sprawia, że plik jest wykonywalny, co oznacza, że można go uruchomić wpisując jego nazwę, tak jak w drugiej linii.
Jeśli w Twoim terminalu pojawi się napis „Hello, World” wydrukowany w wierszu, oznacza to, że wszystko działa zgodnie z wymaganiami.
Jak działają pętle For
W programowaniu ogólnym istnieją dwa główne typy pętli for: numeryczny i dla każdego. Typ liczbowy jest tradycyjnie najpowszechniejszy, ale w przypadku użycia basha jest zwykle odwrotnie.
Numeryczne pętle for zwykle skupiają się na pojedynczej liczbie całkowitej, która określa, ile iteracji zostanie przeprowadzonych, na przykład:
dla (i = 0; i <100; i ++) {
/ * instrukcje do wielokrotnego wykonywania * /
}
Jest to dobrze wyglądająca pętla for, która będzie iterować dokładnie 100 razy, chyba że w pętli zostanie zmieniona i lub inna instrukcja spowoduje zatrzymanie wykonywania pętli for.
Natomiast pętle foreach mają tendencję do działania na strukturach, takich jak listy lub tablice, i iterują dla każdego elementu w tej kolekcji:
people = ["Piotr", "Paweł", "Maria"]
foreach (people as person) {
if (person == "Paul") {
...
}
}
Niektóre języki używają nieco innej składni, która zamienia kolejność kolekcji i elementów:
people = ["Piotr", "Paweł", "Maria"]
dla (person in people) {
if (person == "Paul") {
...
}
}
W pętli
W bash, foreach - lub dla w—Pętla jest bardziej powszechna. Podstawowa składnia to po prostu:
dla argumentu w [lista]
zrobić
/ * instrukcje do wielokrotnego wykonywania * /
/ * wartość argumentu można uzyskać za pomocą $ arg * /
gotowy
Na przykład, aby przejść przez trzy jawnie nazwane pliki:
dla pliku w jednym.c dwa.c trzy.c
zrobić
ls „$ file”
gotowy
Jeśli takie pliki istnieją w bieżącym katalogu, dane wyjściowe tego skryptu będą wyglądać następująco:
one.c
dwa.c
trzy.c
Zamiast ustalonego zestawu plików listę można uzyskać za pomocą wzorca glob (zawierającego symbole wieloznaczne - znaki specjalne, które reprezentują inne znaki). W poniższym przykładzie pętla for wykonuje iterację we wszystkich plikach (w bieżącym katalogu), których nazwy kończą się na „.xml”:
dla pliku w formacie * .xml
zrobić
ls -l "$ plik"
gotowy
Oto przykładowe dane wyjściowe:
$ -rw-r - r-- 1 pracownik bobby 2436 3 listopada 2019 r. feed.xml
$ -rw-r - r-- 1 pracownik bobby 6447 27 października 16:24 sitemap.xml
Może to wyglądać jak rozwlekły sposób:
$ ls -l * .xml
Ale jest istotna różnica: pętla for wykonuje plik ls program 2 razy, z pojedynczą nazwą pliku przekazywaną do niego za każdym razem. W oddzielnym przykładzie ls wzorzec glob (* .xml) najpierw dopasowuje nazwy plików, a następnie wysyła je wszystkie, jako indywidualne parametry wiersza poleceń, do jednej instancji ls.
Oto przykład wykorzystujący rozszerzenie toaleta (liczba słów), aby różnica była bardziej oczywista:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
Łącznie 275
Plik toaleta program zlicza osobno wiersze w każdym pliku, a następnie wypisuje łączną liczbę wszystkich z nich. W przeciwieństwie do tego, jeśli toaleta działa w pętli for:
dla pliku w formacie * .xml
zrobić
wc -l $ plik
gotowy
Nadal będziesz widzieć liczbę dla każdego pliku:
44 feed.xml
231 sitemap.xml
Ale nie ma ogólnego podsumowania, ponieważ toaleta jest uruchamiany w izolacji, za każdym razem, gdy pętla się iteruje.
Kiedy lista nie jest listą
Podczas korzystania z pętli for występuje bardzo łatwy i częsty błąd związany ze sposobem, w jaki bash obsługuje cytowane argumenty / ciągi. Zapętlenie listy plików powinno być wykonane w następujący sposób:
dla pliku w jednym.c dwa.c
Nie tak jak to:
dla pliku w „jeden.c dwa.c”
W drugim przykładzie nazwy plików są umieszczane w podwójnych cudzysłowach, co skutkuje listą zawierającą tylko jeden parametr; pętla for wykona tylko jeden raz. Tego problemu można uniknąć, używając zmiennej w takich przypadkach:
FILES = "jeden.c dwa.c"
dla pliku w $ FILES
zrobić
...
gotowy
Zwróć uwagę, że sama deklaracja zmiennej musi zawierać jej wartość w podwójnych cudzysłowach!
Bez listy
Nie mając nic do iteracji, pętla for działa na dowolnych argumentach wiersza poleceń, które zostały dostarczone do skryptu podczas wywołania. Na przykład, jeśli masz skrypt o nazwie args.sh zawierające następujące elementy:
#! / bin / sh
dla
zrobić
echo $ a
gotowy
Następnie wykonanie args.sh da ci:
$ ./args.sh raz dwa trzy
jeden
dwa
trzy
Bash rozpoznaje tę sprawę i traktuje do zrobienia jako odpowiednik za $ @ zrobić gdzie $ @ jest specjalną zmienną reprezentującą argumenty wiersza poleceń.
Emulowanie tradycyjnej pętli liczbowej For
Skrypty Bash często zajmują się listami plików lub wierszami danych wyjściowych innych poleceń, więc pętla for in jest powszechna. Jednak tradycyjna operacja w stylu c jest nadal obsługiwana:
dla ((i = 1; i <= 5; i ++))
zrobić
echo $ i
gotowy
To klasyczna forma z trzema częściami, w których:
- zmienna jest inicjalizowana (i = 1) przy pierwszym napotkaniu pętli
- pętla trwa tak długo, jak długo warunek (i <= 5) jest prawdziwy
- za każdym razem wokół pętli zmienna jest zwiększana (i ++)
Iterowanie między dwiema wartościami jest na tyle powszechnym wymogiem, że istnieje krótsza, nieco mniej myląca alternatywa:
dla ja w {1..5}
zrobić
echo $ i
gotowy
Rozwijanie nawiasów, które ma miejsce skutecznie tłumaczy powyższą pętlę for na:
dla i w 1 2 3 4
Dokładniejsza kontrola pętli z przerwaniem i kontynuowaniem
Bardziej złożone pętle for często wymagają sposobu na wcześniejsze wyjście lub natychmiastowe ponowne uruchomienie głównej pętli z kolejną wartością. Aby to zrobić, bash pożycza instrukcje break i continue, które są powszechne w innych językach programowania. Oto przykład wykorzystujący oba, aby znaleźć pierwszy plik, który ma więcej niż 100 znaków:
#! / bin / bash
do pliku w *
zrobić
gdyby [! -f "$ plik"]
następnie
echo "$ plik nie jest plikiem"
kontyntynuj
fi
num_chars = $ (wc -c echo $ file ma „$ num_chars znaków długości”
if [$ num_chars -gt 100]
następnie
echo „Znaleziono plik $”
przerwa
fi
gotowy
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 to katalog), instrukcja continue jest używana do ponownego uruchomienia pętli z kolejnym plikiem po kolei. 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 jest używana do natychmiastowego opuszczenia 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. Używając zmiennych, poleceń zewnętrznych oraz instrukcji break i continue, skrypty bash mogą stosować bardziej złożoną logikę i wykonywać szeroki zakres zadań.
Raport sugeruje, że etykiety prywatności aplikacji Apple mogą mieć pewne problemy.
- Programowanie
- Linux
Bobby jest entuzjastą technologii, który przez prawie dwie dekady pracował jako programista. Pasjonuje się grami, pracuje jako redaktor recenzji w Switch Player Magazine i jest pochłonięty wszystkimi aspektami publikacji online i tworzenia stron internetowych.
Zapisz się do naszego newslettera
Dołącz do naszego biuletynu, aby otrzymywać wskazówki techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Jeszcze jeden krok…!
Potwierdź swój adres e-mail w wiadomości e-mail, którą właśnie wysłaliśmy.