The zmiażdżyć Powłoka zapewnia doskonałą funkcjonalność, jeśli chodzi o pisanie skryptów. Wiąże się to z tak wieloma sposobami iteracji przez stertę danych, że można wiele zrobić, uruchamiając jeden skrypt. Niezależnie od tego, czy przeglądasz mnóstwo wartości liczbowych, dni tygodnia, nazw użytkowników, słów, plików czy czegoś zupełnie innego, zmiażdżyć Ma opcję, która Ci to ułatwi.
pętle for, while i till
Pierwszą rzeczą, którą powinieneś wiedzieć o redundancji zmiażdżyć Czy istnieje kilka podstawowych poleceń do użycia. The Podczas gdy Pętla będzie się zapętlać tak długo, jak długo dany warunek będzie spełniony. The aż do pętla będzie się zapętlać, dopóki jakiś warunek nie stanie się prawdziwy, i dla Pętla będzie przebiegać przez szereg wartości niezależnie od ich pochodzenia.
Na przykład za pomocą Podczas gdyiteruj, gdy liczba jest mniejsza niż 100, iteruj przez pozostałe dni miesiąca, jak pokazano w poniższym skrypcie (gdzie przechwytujemy bieżący dzień za pomocą Data Polecenie i ostatni dzień ostatniej serii na wyjściu kal polecenie) lub przechodzenie przez coś zupełnie innego.
#/bin/bash # day of month day=`date | awk '{print $3'}` # number of days in month numdays=`cal | tail -2 | head -1 | awk '{print $NF}'` while [ $day -le $numdays ] do echo $day ((day++)) done
Po uruchomieniu tego skryptu powinniśmy zobaczyć coś takiego:
$ remaining_days 27 28 29 30
Poniższy skrypt powtarza się, dopóki współpracownik się nie zaloguje. Dopóki liczba logowań użytkowników wynosi zero (czyli nie są oni zalogowani), wyświetlamy „wait” i czekamy kolejne 60 sekund. Gdy użytkownik jest zalogowany, tzw Podczas gdy Pętla zostaje zakończona iw ciągu 60 sekund pojawia się komunikat potwierdzający obecność użytkownika w celu zalogowania.
#!/bin/bash echo -n "user to wait for> " read user while [ `who | grep $user | wc -l` == 0 ] do echo waiting sleep 60 done echo $user is online
The aż do Odcinkowa wersja scenariusza jest bardzo podobna.
#!/bin/bash echo -n "user to wait for> " read user until [ `who | grep $user | wc -l` -gt 0 ] do echo waiting sleep 60 done
w dla Pętle, przechodzimy przez szereg wartości, ale istnieje kilka poleceń, których można użyć do wygenerowania tych wartości.
The Podczas gdy i aż do Polecenia są wyjaśnione w dalszej części Jak powtarzać polecenie Linuksa, aż zadziała
Powtórzenie między literami i cyframi
Możesz powtórzyć ciąg cyfr lub znaków, określając zakres wartości w pliku {zacząć zakończyć} Sformatuj jak w poniższych przykładach. Pamiętaj, że możesz zacząć od dowolnej wartości. Nie musisz zaczynać od „a” lub „0”.
$ for letter in {a..f}; do echo $letter; done a b c d e f
W następnym przykładzie zaczynamy od 5, a nie od 1, i unikamy zwracania pierwszej linii z echo r zamówienie.
$ for number in {5..11}; do echo -n "$number "; done 5 6 7 8 9 10 11 $
Jeśli chcesz, możesz nawet odwrócić kolejność cyfr lub liter. Oto kilka przykładów:
$ for letter in {z..x}; do echo $letter; done z y x
$ for number in {11..7} > do > echo $number > done 11 10 9 8 7
powtarzać na zawsze
Najłatwiejszym sposobem iteracji w nieskończoność jest użycie „Czasami prawdanode. Pętla nie przestanie działać, chyba że ją zabijesz — na przykład za pomocą a Bibliografia. Jeśli jest zawarty w skrypcie działającym w tle, możesz użyć pliku a zabicie Polecenie (np. kill 654321), aby zakończyć działanie skryptu.
$ while true > do > echo Hello > sleep 60 > done Hello Hello ^C
Więcej informacji na temat zapętlania na zawsze można znaleźć pod adresem Jak zapętlać się w nieskończoność w bash w systemie Linux.
Pętle ucieczki z przerwą i kontynuacją
The czas odpoczynku i kontynuować Polecenia umożliwiają całkowite wyskoczenie z pętli (czas odpoczynku) lub uruchom ponownie na początku pętli (kontynuować), pomijając wszelkie polecenia pomiędzy kontynuować Komenda i koniec odcinka.
The czas odpoczynku i kontynuować Polecenia są wyjaśnione bardziej szczegółowo w Używając break i continue wyłamuj się z pętli.
The marszczenie Polecenia można użyć do podzielenia pliku lub łańcucha na części o tym samym rozmiarze. Domyślna długość to 80 znaków. W tym przykładzie dzielimy ciąg znaków na fragmenty po 11 znaków za pomocą rozszerzenia -c11 (11 liter) Opcja.
$ fold -c11 trythis This file h as a few ri diculously long charac ter strings . Oh, well.
Podczas korzystania z pliku marszczenie Sprawa jest w A dla pętli, należy jednak pamiętać, że każdy wynikowy ciąg zawierający spację spowoduje powstanie jednej lub więcej dodatkowych pętli, ponieważ dla Przecinki w każdym łańcuchu są oddzielone spacją.
$ for line in `fold -c10 trythis` > do > echo -n "$line" > echo -n ":" > echo $line | wc -c > done This:5 file:5 has:4 a:2 few:4 ridiculous:11 ly:3 long:5 ch:3 aracter:8 st:3 rings.:7 Oh,:4 well.:6
Więcej o marszczenie Polecenie można znaleźć pod adresem Użyj zagięcia, aby tekst był bardziej czytelny i Użyj polecenia fold, aby sterować pętlami.
Powtórzenie słowo w słowo
iterować po liście słów za pomocą a dla pętli, możesz uruchomić polecenie takie jak to poniżej. Zauważ, że apostrof musi mieć znak zmiany znaczenia, aby nie był interpretowany jako początek łańcucha.
$ for word in all\'s well that ends well; do echo $word; done all's well that ends well
Jeśli chcesz, aby miesiące w roku się powtarzały, możesz użyć takiego polecenia:
$ for month in `locale mon | sed 's/;/ /g'`; do echo $month; done January February March April May June July August September October November December
Powyższe polecenie używa pliku język polecenie, aby uzyskać listę miesięcy i Pan Dzieli linię oddzieloną średnikami na poszczególne miesiące.
Jest zawarta
Redundancja skryptów i wiersza poleceń w systemie Linux jest zdecydowanie jedną z najlepszych technik wykonywania wielu zadań w krótkim czasie i przy minimalnym wysiłku, zwłaszcza jeśli zamieniasz pętle w skrypty, które możesz często uruchamiać. W razie potrzeby bez konieczności każdorazowego zastanawiania się nad każdym szczegółem.
Copyright © 2022 IDG Communications, Inc. Wszelkie prawa zastrzeżone.