]> gitweb.morketsmerke.org Git - mmdev.git/commitdiff
Kontynuowanie tworzenia dodatku A. Podrozdzaiał 18.6.3
authorxf0r3m <jakubstasinski@protonmaill.com>
Wed, 15 May 2024 11:46:34 +0000 (13:46 +0200)
committerxf0r3m <jakubstasinski@protonmaill.com>
Wed, 15 May 2024 11:46:34 +0000 (13:46 +0200)
articles/terminallog/Linux.Podstawy.html

index e52d1366f02a4983dd241ae14edbcd2f176a059f..b0a8b6fd45eb8a566b299e461201cc7cc117b553 100644 (file)
@@ -14001,7 +14001,195 @@ done
           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;