wykonywana dopóki warunek będzię spełniony (będzie zwracać prawdę).
Blok kodu pętli, kończy się słowem kluczowym
<code class="code-inline">done</code>.
- </p>
+ </p>
+ <h3 id="18.4.2.forloop">18.4.2. Pętla for</h3>
+ <p>
+ Pętla <em>for</em> działa na odmiennej zasadzie niż pętla
+ <em>while</em>. W tym przypadku zamiast warunku, mamy listę oraz
+ jej element (zmienną). Pętla wykonuje swoje działanie do momentu, aż
+ skończą się elementy na liście. Elementy te są przypisywane do
+ zmiennej i następnie uruchamiany jest blok kodu pętli. Za pomocą
+ zmiennej możemy odwłać się do elementu ustawionego dla tego
+ przebiegu pętli. Poniżej znajduje się przykładowa pętla <em>for</em>
+ realizująca to samo zadanie co pętla <em>while</em>.
+ </p>
+<pre class="code-inline">
+for i in 1 2 3 4 5 6 7 8 9 10; do
+ echo "${i}: $(expr $i \* $i)";
+done
+</pre>
+ <p>
+ W tym przypadku list została zapisana z ręki (<em>hardcoded</em>).
+ Jednak tutaj panuje duża elastyczność, listę możemy przekazać zmienną
+ lub w postaci podstawienia polecenia. Wykonanie zadania zostało
+ skompresowane do pojedynczej linii.
+ </p>
+ <h3 id="18.4.3.otherloops">18.4.3. Inne pętle oraz instrukcje sterujące</h3>
+ <p>
+ Poza omówionymi wyżej pętlami, BASH oferuje jeszczę pętlę
+ <em>do-while</em>, której cechą charakterystyczną jest fakt, iż
+ wykona się co najmniej raz, ponieważ sprawdzanie warunku występuje
+ poniżej bloku kodu pętli, kiedy zostaną wykonane jej instrukcje
+ wówczas będzie można określić czy warunek zwraca kod wyjścia 0 czy
+ też inny. Kolejną z pętli jest pętla <em>select</em>, która na
+ podstawie listy wyświetla menu, oddając wykonanie programu pod
+ interaktywną decyzję użytkownika. Użytkownik wybierając odpowiedni
+ numer ustawia wartość przedstawioną w tym przypadku do zmiennej,
+ do której można się odwołać w bloku kodu pętli. Powtarzalność tej
+ konstrukcji, polega na tym, że będzie ona ciągle pytać użytkownika o
+ wybór do momentu, aż nie przerwiemy wykonania całego skryptu lub
+ w bloku kodu funkcji zaimplementujemy warunek, że jeśli została
+ wybrana powiedzmy litera 'q', to zakończ pętlę. Poniższy przykład
+ wyświetla nazwy kolorów dostępnych do wyświetlenia w powłoce,
+ po wybraniu koloru, zostanie wyświetlona jego próbka.
+ </p>
+<pre class="code-block">
+colors="black red green yellow blue purple cyan white";
+select i in $colors; do
+ case $i in
+ 'black') cc=0;;
+ 'red') cc=1;;
+ 'green') cc=2;;
+ 'yellow') cc=3;;
+ 'blue') cc=4;;
+ 'purple') cc=5;;
+ 'cyan') cc=6;;
+ 'white') cc=7;;
+ esac
+ echo -e "${i}: \e[1;4${cc}m \e[0m";
+done
+</pre>
+ <p>
+ Instrukcjami wpływającymi na działanie pętli w BASH-u są instrukcje:
+ <strong>break</strong> oraz <strong>continue</strong>.
+ Instrukcja <em>break</em> służy przerwaniu wykonania pętli i
+ przejściu do instrukcji znajdującej się tuż za pętlą, inaczej jest
+ w przypadku instrukcji <em>continue</em>. Instrukcja ta powoduje
+ zresetowanie przebiegu pętli - wykonanie wraca do sprawdzenia
+ warunku i rozpoczęcia wykonania bloku kodu od nowa.
+ </p>
+ <h2 id="18.5.functions">18.5. Funkcje</h2>
+ <p>
+ Funkcje w BASH-u służą temu samemu celowi co w innych językach
+ programowania - udostępnieniu fragmentów kodu realizującego
+ powtarzalne zadania, aby nie trzeba było ich przepisywać.
+ Dopasowuje się algorytm tak, aby mógł działać z podanymi z zewnątrz
+ danymi, ponieważ funkcję uruchamia się w taki sam sposób jak
+ polecenie.
+ </p>
+ <h3 id="18.5.1.fdefinitionandexecution">18.5.1. Definicja oraz wywołanie funkcji</h3>
+ <p>
+ Definicja funkcji wymaga użycia specjalnej konstrukcji
+ <strong>function</strong>. Przykładową definicję zamieszczono
+ poniżej:
+ </p>
+<pre class="code-block">
+function square () {
+ echo "$(expr $1 \* $1)";
+}
+</pre>
+ <p>
+ Definicja funkcji wymaga słowa kluczowego
+ <code class="code-inline">function</code> następnie nazwy funkcji
+ oraz pary okrągłych nawiasów (<strong>()</strong>). Sekcję bloku
+ kodu funkcji wskazują nawiasy klamrowe (<strong>{}</strong>).
+ Dane z zewnątrz zostały zaimplementowane pod postacią parametrów
+ pozycjnych. Oczywiście, może nam się wydawać, że definiowanie
+ funkcji dla pojednczego polecenia może nie końca mieć sens,
+ nie mniej jednak takie działanie może posłużyć jako ustawienie
+ <strong>aliasu</strong>, dla czynności, które mozna zapisać w
+ krótki i prosty sposób, nie tłumaczący jednak dokońca jaka operacja
+ jest wykonywana.
+ </p>
+ <p>
+ Funkcje tak jak już wspominałem, są wywoływane jak polecenia. Tak
+ więc chcąc wywołać wcześniej zdefiniowaną funkcję należy zapisać
+ <strong>pod jej definicją</strong> następujące polecenie:
+ </p>
+<pre class="code-block">
+square 4;
+</pre>
+ <h3 id="18.5.2.includescripts">18.5.3. Dołączanie plików skryptów</h3>
+ <p>
+ Korzystając z możliwości tworzenia funkcji może się okazać, że jest
+ ich całkiem spora ilość i dużo lepszym sposobem na zarządzanie nimi
+ jest przeniesienie do innego pliku. Wówczas aby móc dalej korzystać
+ z tych funkcji muszą być one dostępne dla skryptu w którym będą
+ wywoływane. W BASH-u nie mamy takich poleceń jak <em>include</em> czy
+ <em>import</em>. Tutaj musimy posłużyć się <strong>wywołaniem skryptu
+ w tym samym proces powłoki</strong>, dzięki temu obszar pamięci
+ będzie taki sam, więc dla intepretera wykonującego główny skrypt
+ wczytane z innego pliku funkcję będą dostępne, przez co główny
+ skrypt będzie wstanie z nich skorzystać.
+ </p>
+ <p>
+ Dołaczenie dodatkowego skryptu można zrealizować na dwa sposoby.
+ Wykonują one tę samą operację i różnią się tylko zapisem. Do wyboru
+ mamy polecenie <strong>source</strong> oraz zwykłą kropkę
+ (<strong>.</strong>).
+ </p>
+<pre class="code-block">
+source functions.sh
+#lub:
+. functions.sh
+</pre>
+ <p>
+ Drugi sposób nie jest tożamy z takim zapisem jak:
+ <code class="code-inline">./functions.sh</code>. Tym przypadku
+ kropka została użyta jako element ścieżki. My będziemy
+ wykorzystywać ją jako polecenie.
+ </p>
+ <h2 id="18.6.otherusefulltools">18.6. Inne przydatne narzędzia</h2>
+ <p>
+ Tworząc skryptu w BASH-u, za pewne będziemy pracować z tekstami.
+ Takim zadaniem może być wyciągnięcie z pliku <em>feed</em>-u RSS
+ adresu odnośnika do najnowszej wersji oprogramowania, którego
+ używamy. Jest to jedno z kilku przykładów, do których będziemy
+ potrzebowali narzędzi, które mogą być wykorzystywane w wielu
+ skryptach.
+ </p>
+ <h3 id="18.6.1.cut">18.6.1 Polecenie cut</h3>
+ <p>
+ Polecenie <strong>cut</strong> może być wykorzystywane do
+ ekstrakcji podciągu znaków z innego ciągu. W tym przypadku jego
+ działanie będzie opierać się na wskazaniu ogranicznika za pomocą
+ opcji <em>-d</em>, przez co ciag znaków - najczęsciej przekazany na
+ standardowej wejście (polecenie <em>cut</em> często jest umieszczane
+ w potoku) - podzielony zostaje na pola, które możemy wybrać podając
+ numer tego pola liczony od początku ciągu. Tutaj warto zazanaczyć,
+ że część ciągu do wystąpienia pierwszego ogranicznika, będzie
+ pierwszym polem. Dostęp do pól uzyskujemy za pomocą opcji
+ <em>-f</em>
+ </p>
+<pre class="code-block">
+...| cut -d " " -f 2 |...
+</pre>
+ <h3 id="18.6.2.awk">18.6.2. AWK</h3>
+ <p>
+ Samo narzędzie AWK jest języka programowania operującym na tekstach.
+ Nie mniej jednak, nie będziemy skupiać się na szczegółach tego
+ narzędzia. Wykorzystamy jedną z jego funkcjonalności. Wspomniane
+ wcześniej ma jedną zasadniczą wadę, możemy miec problem z określeniem
+ żądanego pola, w momencie gdy znak ogranicznika występuje po sobie
+ kilka razy. Najczęściej jest tak z białymi znakami
+ (spacją oraz znakami tabulacji). Wówczas możemy skorzystać z pól
+ prezentowanych przez narzędzie AWK, pola tego narzędzia są tak
+ naprawdę kolumnami, więc zadbać o odseparowanie konkretnej linii.
+ Tutaj podział jest prosty, każda kolumna rozpoczyna się od każdego
+ innego znaku nie będącego tabulatorem lub spacją. Numer kolumny
+ po znaku dolara, tak jak na poniższym przykładzie.
+ </p>
+<pre class="code-block">
+... | awk '{printf $1}' | ...
+</pre>
+ <p>
+ Narzędzie zbierze wszystkie ciągi występujące w tej kolumnie w jeden
+ ciąg bez żadnych przerw. Dodając trzy znaki, możemy zamienić ten
+ nieczytelny ciąg znaków, chociażby w listę dla pętli <em>for</em>.
+ </p>
+<pre class="code-block">
+... | awk '{printf $1" "}' | ...
+</pre>
</div>
<p style="margin: 15px; padding: 0; outline: 0;">
2024; COPYLEFT; ALL RIGHTS REVERSED;