Składnia (START..END) jest obsługiwana począwszy od wersji bash 3.0+, a składnia (START..END..INCREMENT) jest obsługiwana począwszy od wersji bash 4.0+:
Do VAR W {Przykład (ukończ, gdy i=6 i nie wykonuj, gdy i=3 i i=5): Do i w (1..8); Do Jeśli[ $i -równ. 6 ]; Następnie przerwa; fi Jeśli[ $i -równ. 3 ] || [ $i -równ. 5 ]; Następnie Kontynuować; fi echo $i zrobione Wynik wykonania: $ $ dla i w (1..8); wykonaj \ > if [ $i -eq 6 ]; następnie złam; fi; \ > if [ $i -eq 3 ] || [ $i -równ. 5 ]; następnie kontynuuj; fi; \ > echo $i; \ > zrobione 1 2 4
Krótki opis różnic w typach pętli:
for - wykona akcję, dopóki istnieją obiekty do wykonania (na przykład odczytanie strumienia ze standardowego wejścia, pliku lub funkcji);
while - wykonuje akcję do stan jest prawdą;
dopóki - będzie wykonywane tak długo, jak stan nie stanie się prawdą, tj. na razie to nieprawda.
Rozważmy tę wersję skryptu z pętlą:
$ cat pętli.sh #!/bin/bash dla zmiennej w `ls -1` wykonaj echo "$zmienna" zrobione
Składnia jest bardzo prosta i dość wyraźnie pokazana na przykładzie:
for (uruchamianie pętli) zmienna (deklaracja zmiennej, na której będziemy wykonywać akcje) w (wysyłanie przepływu do pętli) `ls -1` (polecenie do wykonania i przekazane do zmiennej $zmienna). Do i sporządzono to „treść” pętli, w obrębie której zostaną wykonane główne akcje na odebranych danych, a echo „$zmienna” to rzeczywista akcja wykonywana przez pętlę.
Zmieńmy teraz trochę przykład i zamiast jawnie określać polecenie, użyjemy drugiej zmiennej:
$ cat pętli.sh #!/bin/bash ls=`ls -1` dla zmiennej w $ls wykonaj echo "$zmienna" zrobione
Teraz polecenie ls -1 jest przekazywane w osobnej zmiennej, co pozwala na bardziej elastyczną pracę z pętlą. Zamiast zmiennej w pętli możesz także użyć funkcji:
$ cat pętli.sh #!/bin/bash lsl () ( ls -1 ) dla zmiennej w `lsl` wykonaj echo "$zmienna" zrobione
Głównym warunkiem pętli for jest to, że będzie ona wykonywana tak długo, jak przekazane jej polecenie zawiera obiekty do akcji. Bazując na powyższym przykładzie - o ile ls -1 ma pliki do wyświetlenia - pętla przekaże je do zmiennej i wykona „treść pętli”. Gdy tylko lista plików w katalogu się skończy, cykl zakończy swoje wykonanie.
Uczyńmy przykład nieco bardziej skomplikowanym.
Katalog zawiera listę plików:
$ ls -1 plik1 plik2 plik3 plik4 plik5 pętla.sh nofile1 nofile2 nofile3 nofile4 nofile5
Musimy spośród nich wybrać tylko te, które nie mają słowa „ NIE«:
$ cat pętli.sh #!/bin/bash lsl=`ls -1` dla zmiennej w $lsl wykonaj echo "$zmienna" | grep -v „nie” zrobione $ ./loop.sh plik1 plik2 plik3 plik4 plik5 pętla.sh
W pętli można także używać wyrażeń warunkowych ( wyrażenia warunkowe) […], aby sprawdzić warunki i instrukcję break, aby przerwać pętlę, jeśli warunek zostanie uruchomiony.
Rozważmy ten przykład:
$ cat pętli.sh #!/bin/bash lsl=`ls -1` dla zmiennej w $lsl wykonaj if [ $zmienna != "loop.sh" ] następnie echo "$zmienna" | grep -v „nie” w przeciwnym razie przerwanie fi zakończone
Pętla będzie kontynuowana aż do napotkania plikuloop.sh. Gdy tylko wykonanie pętli dotrze do tego pliku, pętla zostanie przerwana komendą break:
$ ./loop.sh plik1 plik2 plik3 plik4 plik5
Innym przykładem jest użycie operacji arytmetycznych bezpośrednio przed wykonaniem ciała pętli:
$ cat pętli.sh #!/bin/bash for ((liczba=1; liczba<11; count++)) do echo "$count" done
Tutaj ustawiamy trzy polecenia sterujące - liczba = 1, warunek kontrolny - gdy liczba jest mniejsza niż 11 i polecenie do wykonania - liczba +1:
Prosty przykład, który wyraźnie pokazuje, jak działa pętla while:
$ cat pętli.sh #!/bin/bash liczba = 0 podczas [ $ liczba -lt 10 ] do ((liczba++)) echo $ liczba wykonana
Ustawiamy zmienną $count na zero, a następnie uruchamiamy pętlę whi z warunkiem „jeśli liczba $ jest mniejsza niż dziesięć, wykonaj pętlę”. W ciele pętli wykonujemy przyrost przyrostkowy+1 do zmiennej $count i wynik jest wypisywany na standardowe wyjście.
Wynik wykonania:
$ ./loop.sh 1 2 3 4 5 6 7 8 9 10
Gdy tylko wartość zmiennej $count osiągnęła 10, pętla zatrzymywała się.
Dobry przykład „nieskończonej” pętli, która pokazuje, jak działa while:
$ cat pętli.sh #!/bin/bash liczba = 10 podczas gdy [ 1 = 1 ] do ((liczba++)) echo $ liczba wykonana $ ./loop.sh ... 5378 5379 5380 5381 5382 5383 ^C
Pętla Until działa podobnie, ale w przeciwnym kierunku:
$ cat pętli.sh #!/bin/bash liczba = 0 do [ $ liczba -gt 10 ] do ((liczba++)) echo $ liczba zakończona
Tutaj ustawiamy podobny warunek, ale zamiast „kiedy zmienna jest mniejsza niż 10”, podajemy „aż zmienna stanie się większa niż 10”. Wynik wykonania:
$ ./loop.sh 1 2 3 4 5 6 7 8 9 10 11
Jeśli powyższy przykład „nieskończonej pętli” zostanie wykonany przy użyciu Until, nie wyświetli niczego, w przeciwieństwie do while:
$ cat pętli.sh #!/bin/bash liczba = 10 do [ 1 = 1 ] do ((liczba++)) echo $ liczba wykonana $ ./loop.sh $
Ponieważ " stan» pierwotnie « PRAWDA„-treść pętli nie zostanie wykonana.
Podobnie jak w pętli for, możesz używać funkcji in while i before. Na przykład pętla z rzeczywistego skryptu sprawdzającego stan serwera Kocur(PID jest pobierany z systemu SLES, może się różnić w innych systemach), wersja nieco uproszczona:
$ cat pętli.sh #!/bin/bash check_tomcat_status () ( RUN=`ps aux | grep Tomcat | grep -v grep | grep java | awk "(drukuj $2)"` ) while check_tomcat_status wykonaj if [ -n "$ URUCHOM" ], a następnie printf "OSTRZEŻENIE: Tomcat nadal działa z PID $RUN."
Wynik wykonania:
else printf „Tomcat zatrzymany, kontynuuje… nn” przerwanie zakończone
$ ./loop.sh OSTRZEŻENIE: Tomcat nadal działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa z PID 14435 26548. OSTRZEŻENIE: Tomcat nadal działa z PID 14435
Pełna wersja:
Check_tomcat_status () ( RUN=`ps aux | grep tomcat | grep -v grep | grep java | awk "(drukuj 2 $)"` ) while check_tomcat_status; wykonaj if [ -n "$RUN" ], a następnie printf "OSTRZEŻENIE: Tomcat nadal działa z PID $RUN. Zatrzymaj go? " odpowiedz "Zatrzymywanie Tomcat..." "Kontynuacja instalacji..." && $CATALINA_HOME/bin/shutdown .sh 2&>1 /dev/null || przerwać sen 2 if [ -n "$RUN" ] to printf "Tomcat nadal działa. Zabić go? " odpowiedź "Zabić Tomcat..." "Kontynuacja instalacji...n" && zabij $RUN || przerwać sen 2 fi else printf „Tomcat zatrzymany, kontynuuje… nn” przerwa fi zakończona
Funkcja odpowiedzi została opisana w artykule, ale tutaj zastosowano nieco ulepszoną wersję:
Odpowiedź () ( podczas czytania odpowiedzi; wykonaj echo case $odpowiedź w |) printf "1n $" return 0 break ;;
|) printf "2n $" zwróć 1 przerwę ;;
*) printf "Proszę wpisać T(tak) lub N(nie)!" esac gotowe )
Tutaj można było użyć zarówno while, jak i Until - ale nie pętli for, ponieważ for zadziałałoby raz (otrzymał PID i zakończył się).
A teraz kolej na piąty temat cyklu. Będę w nim dalej przyglądać się strukturom kontrolnym interpretera poleceń bash. W poprzednim poście omawiane były instrukcje warunkowe. Teraz przyszła kolej na takie integralne struktury językowe, jak operatory pętli. Pętle, podobnie jak warunki, są narzędziami zapewniającymi kontrolę nad kolejnością wykonywania poleceń.
Bash obsługuje pętle for, while, Until i Select. Przejdźmy teraz do szczegółowego rozważenia każdego z nich.
Operator pętli for
Ogólna składnia instrukcji for jest następująca:
dla zmiennej
Operator pętli while
Ogólna składnia instrukcji while wygląda następująco:
podczas gdy lista 1
Operator pętli for
lista2
dla zmiennej
Aż do operatora pętli
Ogólna składnia instrukcji Until jest następująca:
aż do listy 1
Operator pętli for
lista2
dla zmiennej
Wybierz instrukcję pętli
Ogólna składnia instrukcji Select jest następująca:
wybierz zmienną
Operator pętli for
lista
dla zmiennej
Wybierz plik do wyświetlenia:
1) /home/istergul/temp/file.txt
2) /home/istergul/temp/proto.txt
3) /home/istergul/temp/readme
4) Zrezygnuj
W następnym temacie przyjrzymy się warunkowym podstawieniom parametrów. Czekam z niecierpliwością na Twoje komentarze.
Pętle są rzeczą niezwykle wygodną przy pisaniu dowolnych programów czy skryptów, wręcz niezbędną. Pozwalają nam wykonać określoną sekcję kodu określoną liczbę razy. Naturalnie, bash ma kilka rodzajów pętli. Opiszemy cykle na, na, podczas, do. Chociaż for in i for są uważane za różne składnie tej samej instrukcji, moim zdaniem różnią się one od siebie bardziej niż while od do.
Cykl za w To jest pętla z licznikiem. Blok kodu znajdujący się w ciele pętli jest powtarzany tyle razy, ile jest wartości zawartych na liście operatora for in i przy każdym powtórzeniu zmienna licznika (tutaj nazywa się to var, ale oczywiście możesz to nazwać jak chcesz) ma wartość następnego elementu listy.
Jeżeli słowo kluczowe do znajduje się w tej samej linii co słowo for, to po liście argumentów (przed wykonaniem) należy postawić średnik.
Każdy z elementów<список>może zawierać kilka argumentów. Jest to przydatne podczas przetwarzania grup parametrów. W tym przypadku, aby wymusić analizę każdego z argumentów w<списке>, musisz użyć instrukcji set
Możesz użyć zmiennej jako listy w pętli for.
W<списке>W pętli for można używać nazw plików, które z kolei mogą zawierać znaki wieloznaczne. Może to być bardzo przydatne podczas pracy z dużą liczbą plików.
Jeśli<список>nie jest określony w pętli for, wówczas używana jest jako zmienna $@ - lista argumentów wiersza poleceń.
Tworząc listę argumentów, możesz użyć podstawienia poleceń w pętli for.
Wyjście pętli można przekierować ze standardowego wyjścia do pliku lub gdziekolwiek indziej (więcej informacji na ten temat można znaleźć w artykule Przekierowanie we/wy).
Składnia:
dla var w<список>
Do
<выполняемые команды>
zrobione
Przykład:
dla nazw w nazwie1 nazwa2 nazwa3 nazwa4
Do
echo $imion
zrobione
Operator pętli Do ma inny sposób zapisu - bardzo podobny do składni operatora for w języku C. W tym przypadku podczas inicjalizacji liczników ustawiane są początkowe wartości zmiennych lub jednej zmiennej i po każdym przejściu pętli warunek. jest zaznaczone, jeśli sprawdzenie zwróci wartość true, rozpoczyna się następny przebieg pętli. W bloku<приращение счётчиков>wartość naszych liczników zmiennych musi koniecznie się zmienić (niekoniecznie w górę), aby przy sprawdzaniu warunku prędzej czy później otrzymaliśmy wartość false, w przeciwnym razie pętla nigdy się nie skończy. Bardzo wygodna i, co najważniejsze, znana opcja, jeśli jakakolwiek operacja wymaga powtórzenia określoną liczbę razy.
Z podobną składnią:
Do ((<инициализация счётчиков>; <проверка условия>; <приращение счётчиков>))
Do
<выполняемые команды>
zrobione
Przykład:
dla ((zmienna=1; zmienna<= LIMIT ; var++))
Do
echo $zmienna
zrobione
Jest to dość prosta konstrukcja, która sprawdza stan za operatorem chwila i jeśli ten warunek jest spełniony, wykonuje blok poleceń znajdujący się pomiędzy słowami do i gotowe, a następnie ponownie przystępuje do sprawdzania warunku. Jeżeli sprawdzenie zwróci wartość false, cykl się kończy i rozpoczynają się wykonywanie następujących poleceń: zrobione. Koniecznie należy to zapewnić<проверка условия>zależy od kodu działającego w pętli; w przeciwnym razie, jeśli wynik sprawdzenia się nie zmieni, otrzymasz nieskończoną pętlę.
Standardowe urządzenie wejściowe dla pętli while można przekierować do pliku za pomocą polecenia redirection< в конце цикла.
Składnia:
chwila<Проверка условия>
Do
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
zrobione
Przykład:
podczas gdy [ $var0 -eq 100 ]
Do
echo $zmienna
zmienna++
zrobione
Operator chwila może mieć kilka warunków. Ale dopiero ostatni z nich przesądza o możliwości kontynuacji cyklu. W takim przypadku składnia operatora pętli będzie inna niż zwykle.
Składnia(Powtarzam jeszcze raz, że tylko ostatni warunek wpływa na wykonanie pętli) :
chwila
<условие1>
<условие2>
<условиеN>
Do
<выполняемые команды - тело цикла>
zrobione
Operator dopóki jest bardzo podobny do while, również ocenia warunek, ale wykonuje treść pętli, jeśli wynik obliczeń jest fałszywy. Może się to wydawać niezwykłe, ale dopóki nie oceni warunku przed pierwszym przebiegiem pętli, na przykład while, a nie po nim. Podobnie jak w przypadku pętli for/in, umieszczając słowo kluczowe do w tym samym wierszu, co deklaracja pętli, należy wstawić znak „;”. zanim to zrobisz.
Podobnie jak w poprzednim przypadku należy pamiętać, że warunek musi zależeć od operacji w treści pętli, w przeciwnym razie nasz skrypt nigdy nie zostanie ukończony.
Składnia:
dopóki<Проверка условия>
Do
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
zrobione
Przykład:
aż [ $var0 -gt 100] # Warunek jest sprawdzany na początku iteracji.
Do
echo $zmienna
var--
zrobione
To chyba na razie wystarczy. :)
MS SQL, jak każdy porządny przemysłowy system DBMS, wraz z bazą danych, prowadzi logi transakcyjne, które pozwalają na przywrócenie stanu...
W tym wykładzie kontynuujemy zapoznawanie się grzmotnąć. Przypominam, że rozważamy właśnie te elementy grzmotnąć, co pomoże nam zrozumieć skrypty systemu operacyjnego. Takimi elementami są z pewnością pętle i funkcje. Jeśli ktoś studiował programowanie, nie będzie miał trudności ze zrozumieniem tych pytań.
Cykl Do V grzmotnąć ma dwa typy. Przyjrzyjmy się najpierw wersji klasycznej Do. Ogólny pogląd jest następujący:
Pomiędzy elementami Do I W ustawiana jest zmienna, która z kolei przyjmuje wartość z ciągu wartości określonych pomiędzy W I Do. Między Do I zrobione istnieją polecenia, które są wykonywane za każdym razem, gdy zmienna zmienia swoją wartość. Pętla kończy się, gdy zmienna przyjmuje ostatnią wartość z sekwencji. Wartości w sekwencji oddzielane są spacjami.
Oto praktyczny przykład:
Sekwencję wartości można określić na różne sposoby. Jawnie - jak w powyższym przykładzie lub przy użyciu innych zmiennych lub przy użyciu specjalnych poleceń. Spójrzmy na kilka przykładów. Ponieważ wartości są podawane oddzielone spacjami, wartościami takimi może być dowolna zmienna zawierająca ciąg znaków ze spacjami:
Wynik będzie taki sam jak w pierwszym przykładzie.
Jeśli chcesz określić ciąg liczb, możesz użyć polecenia nast oraz mechanizm substytucyjny. Zespół nast zwraca na ekran ciąg wartości numerycznych. Składnia jest prosta i będzie jasna na podstawie poniższego przykładu:
Wynik:
Wróćmy do drugiego typu Do. Często w skryptach można spotkać tzw. wariant C Do, który jest używany w pętlach liczbowych. Rzućmy okiem na przykład:
Pętla działa tak długo, jak testowany warunek w wyrażeniu jest prawdziwy. Gdy tylko wyrażenie zwróci wartość false, wykonywanie pętli zostanie zatrzymane.
Praktyczny przykład:
#!/bin/bash
ja=1
podczas gdy [ $i -lt 7 ]
Operator pętli for
echo $i
niech i=i+1
zrobione
W naszym przykładzie sprawdzamy, czy zmienna I jest mniejsza niż (-lt) liczba 7 i jeżeli tak, to na ekranie wyświetlana jest wartość zmiennej. Wyrażenie niech i=i+1, zwiększa zmienną o jeden, sprawdza ponownie itp. let mówi interpreterowi, że argumenty powinny być rozpoznawane jako wartości liczbowe. Linię tę można zapisać jako niech ja++(wariant podobny do c). Gdy liczba wzrasta o więcej niż jeden, można to zapisać w następujący sposób: niech ja+=2- w tym przypadku I będzie zwiększany o 2. Inną opcją zwiększania zmiennej jest użycie wbudowanego kalkulatora (działa tylko z liczbami całkowitymi). Dostęp do kalkulatora można uzyskać poprzez podwójne nawiasy: i=$(($i+1)) lub przez kwadratowe: i=$[$i+1] Możesz także użyć kalkulatora w wierszu poleceń:
Trzeba uważać z pętlami, żeby nie skończyć się pętlą nieskończoną. Przy okazji do debugowania grzmotnąć skrypty, na które możesz zmienić pierwszą linię #!/bin/bash -x lub uruchom skrypt za pomocą polecenia bash -x:
igor@ubuntu:~/linux$ bash -x ./testfor.sh
+ ja=1
+ „[„ 1 -gt 5 „]”
+ echo i=1
ja=1
+ niech i=i+1
+ „[„ 2 -gt 5 „]”
+ echo i=2
ja=2
+ niech i=i+1
+ „[„ 3 -gt 5 „]”
+ echo i=3
ja=3
+ niech i=i+1
+ „[„ 4 -gt 5 „]”
+ echo i=4
ja=4
+ niech i=i+1
+ „[„ 5 -gt 5 „]”
+ echo i=5
ja=5
+ niech i=i+1
+ „[„ 6 -gt 5 „]”
Pamiętaj, aby poćwiczyć pisanie małych skryptów, aby ugruntować swoją wiedzę na temat działania pętli grzmotnąć.
Funkcje są używane w grzmotnąć bardzo szeroki. Funkcje opisuje się na dwa sposoby: za pomocą słowa kluczowego funkcjonować i bez tego.
Pierwszy sposób:
funkcja nazwa_funkcji
{
ciało funkcyjne
}
Drugi sposób:
nazwa_funkcji()
{
ciało funkcyjne
}
Funkcja jest wywoływana po nazwie w dowolnym miejscu skryptu, ale dopiero po opisaniu samej funkcji. Do funkcji można również przekazywać parametry, które są oddzielane spacją po wywołaniu funkcji (nazwie). Spójrzmy na przykładowy skrypt grzmotnąć:
#!/bin/bash
podkład funkcyjny
{
jeśli [ $# -ne 0 ]
Następnie
lokalny a=1
echo "Liczba przekazanych parametrów - $#"
dla mnie w $@
Operator pętli for
echo "$a-tym parametrem jest $i"
niech +
zrobione
zwróć 0
w przeciwnym razie
echo „Nie przekazano parametrów”
powrót 1
fi
}
echo „Wywołaj funkcję z parametrami:”
elementarz a b c
powtórzyć $?
echo „Wywołaj funkcję bez parametrów:”
elementarz
powtórzyć $?
W tym przykładzie funkcja o nazwie elementarz. Wywołanie funkcji z parametrami: elementarz a b c i bez parametrów: elementarz. W ciele funkcji wszystkie konstrukcje powinny być Ci znane, z wyjątkiem $# , $tj I $@ .$# — zwraca liczbę parametrów przekazanych do funkcji. W naszym przykładzie będzie to liczba 3 .$@ zwraca wszystkie parametry w jednej linii. W przykładzie tak a b c. I przez $1 , $2 , $3 itp. Dostęp do każdego parametru można uzyskać indywidualnie. $? — zawiera kod wykonania ostatniego polecenia. W naszym przykładzie kod wykonania funkcji.
Funkcja może również zwrócić wartość liczbową za pomocą słowa kluczowego powrót. Zwykle zwracają 0, jeśli funkcja została wykonana bez błędów, lub wartość różną od zera, jeśli coś poszło nie tak. W przykładzie, jeśli funkcja została wywołana z parametrami, zwracana jest wartość 0, a jeśli funkcja została wywołana bez parametrów, zwracany jest kod 1.
Wszystko, co dotyczy przekazywania parametrów do funkcji, działa dokładnie tak samo w przypadku skryptu. Możesz także przekazywać parametry do skryptu i manipulować nimi w ten sam sposób, używając $#, $@, $N. Z tej samej kategorii jest opcja - $0 - która zwraca nazwę polecenia, które uruchomiło skrypt. Jeśli skrypt został uruchomiony za pomocą polecenia ./script.sh, potem echo $0 zwróci wartość ./script.sh, a jeśli na polecenie /home/igor/linux/script.sh, wówczas wartość zostanie zwrócona /home/igor/linux/script.sh.