]> gitweb.morketsmerke.org Git - mmdev.git/commitdiff
Kontynuacja tworzenia dodatku A. Podrozdziała 18.2.6 - parametry pozycyjne.
authorxf0r3m <jakubstasinski@protonmail.com>
Fri, 10 May 2024 18:00:12 +0000 (20:00 +0200)
committerxf0r3m <jakubstasinski@protonmail.com>
Fri, 10 May 2024 18:00:12 +0000 (20:00 +0200)
articles/terminallog/Linux.Podstawy.html

index 14ccebedb224b7a33f6282a192cf3f4ddfd5ac56..ba33e8d4d9918b3b6dfa22ce40f70c1283a25bab 100644 (file)
@@ -13565,7 +13565,7 @@ ls
           powłoki BASH. Myślę że upowszechniło się na tyle, że śmiało możemy
           powiedzieć o programowaniu w BASH-u.) zmienne są definiowane w
           prosty sposób. Podajemy nazwę zmiennej (identyfikator), następnie
-          znak równości (<strong>=<strong>) po tym znaku podajemy wartość.
+          znak równości (<strong>=</strong>) po tym znaku podajemy wartość.
           Ważne jest aby <strong>nie robić przerw</strong> między tymi
           elementami, wówczas nazwa zmiennej zostanie potraktowana jako
           polecenie (nazwa programu do uruchomienia).
 <pre class="code-block">
 var=1;
 </pre>
+        <p>
+          Do tak zdefiniowanej zmiennej możemy się odwołać poprzedzając nazwę
+          zmiennej znakiem dolara (<strong>$</strong>).
+        </p>
+<pre class="code-block">
+echo "$var";
+</pre>
+        <p>
+          Polecenie <code class="code-inline">echo</code> wyświetli zawartość
+          zmiennej <code class="code-inline">var</code> na standardowym
+          wyjściu.
+        </p>
+        <h3 id="18.2.2.comments">18.2.2. Komentarze</h3>
+        <p>
+          Ciągi znaków oznaczone jako <strong>komentarze</strong> po przez
+          umieszczenie na ich początku krzyżyka (<strong>#</strong>) są
+          całkowicie ignorowane przez powłokę w trakcie wykonywania skryptu.
+        </p>
+<pre class="code-block">
+# To jest komentarz
+#Tresc komenentarza może przylegać do krzyzyka
+# lub może być miedzy nimi odstep
+</pre>
+        <p>
+          Komentarze mają służyć wyłącznie programiście. Ich zadaniem jest
+          możliwość dodawania notatek do kodu, w celu np. wyjaśnienia zawiłego
+          bloku kodu.
+        </p>
+        <h3 id="18.2.3.pipelines">18.2.3. Potoki</h3>
+        <p>
+          <strong>Potoki</strong> czy inaczej <em>polecenia potokowe</em> są
+          to ciągi poleceń połączonych ze sobą za pomocą mechnizmów
+          wejścia-wyjścia.
+        </p>
+<pre class="code-block">
+cat /etc/passwd | grep 'xf0r3m' | sed 's,/bin/bash,/bin/sh,'
+</pre>
+        <p>
+          W powyższym poleceniu, dane wejściowe programu
+          <code class="code-inline">cat</code> pochodzą z pliku, ale dane
+          wejściowe polecenia <code class="code-inline">grep</code> pochodzą
+          już ze standardowego wyjścia polecenia 
+          <code class="code-inline">cat</code>. Zawartość pliku zostaje
+          przekazana na standardowej wejscie drugiego polecenia, które 
+          wyszukuje odpowiedniego wzorca. Ta sama sytuacja tyczy się ostatniego
+          polecenia (<code class="code-inline">sed</code>). Potoki konstrułuje
+          się przy użyciu znaku potoku lub znaku kreski pionowej
+          (<strong>|</strong>).
+        </p>
+        <p>
+          Potoki są przydatne gdy musimy przetworzyć w jakiś sposób dane,
+          wówczas sprowadzamy je do postaci strumienia. Każde z poleceń na
+          potoku wykonuje swoją działkę i przekazuje je dalej, aż trafiają one
+          do zmiennej lub na standardowej wyjście powłoki. Z prostej analogii
+          wygląda to trochę jak praca na linii produkcyjnej.
+        </p>
+        <p>
+          Powyższy przykład ma duży potencjał optymalizacyjny swoją drogą,
+          ponieważ pierwsze polecenie można pominąć i podać pliki odrazu
+          poleceniu <code class="code-inline">grep</code>.
+        </p>
+        <h3 id="18.2.4.commandsubstitution">18.2.4. Podstawienie polecenia</h3>
+        <p>
+          Mając omówione zmienne oraz potoki, to warto może połączyć ze sobą
+          te zagadnienia i zadać pytanie: w jaki sposób można zapisać w 
+          zmiennej dane przetwarzane przez potok?
+        </p>
+        <p>
+          Chcąc zapisać wynik działania potoku do zmiennej, należy wykorzystać
+          mechanizm zwany <strong>podstawieniem polecenia</strong>. Działa on
+          na takiej zasadzie, że w momencie napotkania tego mechnizmu przez
+          podpowłokę uruchamiana jest kolejna podpowłoka wykonująca polecenia
+          zapisane w tym przypadku w potoku w podstawieniu polecenia. Po
+          zakończeniu wartość zwracana jest przekazywana do zmiennej.
+          Podstawienie polecenia może mieć dwie postacie, można wykorzystać
+          lewe cudzysłowy (<strong>``</strong>) lub parę okrągłych nawiasów
+          poprzezdzonych znakiem dolara (<strong>$()</strong>). Obie te formy
+          są poprawne. Do niedawna istniała jedynie wersja z cudzysłowami.
+        </p>
+<pre class="code-block">
+var=$(grep 'xf0r3m' | sed 's,/bin/bash,/bin/sh,');
+# lub:
+var=`grep 'xf0r3m' | sed 's,/bin/bash,/bin/sh,'`;
+</pre>
+        <h3 id="18.2.5.quotation">18.2.5. Znaki cytowania</h3>
+        <p>
+          Jak było prawdopodobnie wspomniane o znakach cytowania w drugim
+          rozdziale. W BASH-u do dyspozycji mamy 3 rodzaje cudzysłowów:
+        </p>
+        <ul>
+          <li>Lewy cudzysłów - (<strong>`</strong>) - jeden z operatorów
+            podstawienie polecenia.</li>
+          <li>Pojedynczy cudzysłów - (<strong>'</strong>) - cytowanie dosłowne,
+            wszystko zapisane pomiędzy tymi znakami zostanie potraktowane jako
+            ciąg znaków. BASH nie będzie próbować interpretować, żadnych
+            treści w tym i instrukcji.</li>
+          <li>Podwójny cudzysłów - (<strong>"</strong>) - cytowanie niedosłowne,
+            Występujące wewnątrz odwłania do zmiennych czy podstawienia
+            polecenia oraz inne mechnizmy i instrukcje zostaną przez BASH
+            zinterpretowane i wykonane, wówczas wyniki działania BASH-a
+            uzupełnią zapisany ciąg znaków.</li>
+        </ul>
+        <p>
+          Należy o tym pamiętać! Że cudzysłowy w powłoce są rozróżniane i mają
+          różne funkcje. Szczególnie może mieć to znaczenie przy takich
+          poleceniach jak <em>sed</em> czy <em>grep</em>.
+        </p>
+        <h3 id="18.2.6.positionalparams">18.2.6. Parametry pozycyjne</h3>
+        <p>
+          Przekazanie do skryptu informacji jest jak najbardziej możlwe,
+          oczywiście możemy zrobić to jak przypadku innych języków - podczas
+          działania programu poprosić o podanie danych wejściowych. Możemy
+          również użyć mechanizmy <strong>parametrów pozycyjnych</strong>,
+          które pozwolą nam na przekazanie danych wejściowych podczas
+          uruchamiania skryptu.
+        </p>
+<pre class="code-block">
+$ ./test.sh foo bar
+</pre>
+        <p>
+          Dostęp do tak przekazanych danych można uzyskać poprzez odwłanie się
+          do numeru parametru:
+        </p>
+<pre class="code-block">
+#!/bin/bash
+
+echo "1: $1";
+echo "2: $2";
+#
+
+$ ./test.sh foo bar
+1: foo
+2: bar
+</pre>  <p>
+          Parametry pozycyjne są czesto wykorzysywane do implementowania
+          opcji skryptów. Paramentrów jest maksymalnie 10 (chociaż jest mozliwe
+          jest uzyskanie dostępu do parametrów powyżej 10 za pomocą mechanizmu
+          <em>wyrażenia parametru</em>.
+        </p>
+        <p>
+          Dostęp do całej listy parametrów pozycyjnych możemy uzyskać na dwa
+          sposoby. Oba są warte poznania. Pierwszym z nich jest lista
+          parametrów, w której każdy jest osobnym elementem. Dostęp do niej
+          uzyskujemy poprzez - <strong>$@</strong> - tego typu odwołanie się.
+          Innym sposobem dostęp do parametrów jako pojedynczego ciagu znaków,
+          wówczas wszysktie paramety są jednym elementem. Dostęp do parametrów
+          w ten sposób osiągamy poprzez - <strong>$*</strong>.
+        </p>
       </div>
                        <p style="margin: 15px; padding: 0; outline: 0;">
                                2024; COPYLEFT; ALL RIGHTS REVERSED;