</p>
<p>
Wśród Uniksów mamy dostępne kilka rodzajów powłok. Najczęściej będą
- to powłoki BASH oraz KSH (wykorzystywana w środowiska BSD). Obecnie
+ to powłoki BASH oraz KSH (wykorzystywana w środowiskach BSD). Obecnie
w wielu dystrybucjach możemy spotkać się z ewolucją kwestii domyślnej
powłoki a przynajmniej dla naszego domyślnego użytkownika. Co raz
częściej możemy spotkać się z takimi powłokami jak ZSH oraz FISH są
one następcami powłoki BASH, zawierającymi wiele udogodnień
- pozwalających na łatwiejsze tworzenie poleceń powłoki. Obecnie na
+ pozwalających na łatwiejsze tworzenie poleceń. Obecnie na
popularności zyskuje projekt o nazwie <em>nu-shell</em> jest to
nowy rodzaj połoki zmieniający dotychczasowe doświadczenia z nią
związane. Nie mniej jednak informacje przedstawione w tym rozdziale
np. skrypt coś usuwa. Sprawdzenie tego czy nasze pomysły maja w
ogóle sens, pozwala zaoszczędzić czas podczas debugowania skryptu.
Może nam się wydawać, że pewne konstrukcje powłoki są cieżkie do
- zapisania w postaci polecenie. Tak może faktycznie być, ale weźmy
+ zapisania w postaci polecenia. Tak może faktycznie być, ale weźmy
pod uwagę to, że te konstrukcje mają szczególnie zaznaczony początek
i koniec. Jeśli powłoka nie napotka odpowiedniego słowa kluczowego w
wprowadzonym wierszu polecenie wówczas przejdzie w tryb wielolinii,
skryptu jest klasyczna powłoka <em>Bourne</em>-a, albo autor zakłada,
że domyślnym programem dostarczającym powłokę jest BASH, a plik
<em>/bin/sh</em> jest tylko dowiązaniem symboliczym do
- <em>/bin/bash</em>. W przypadku Debiana <em>/bin/sh</em> jest
+ <em>/bin/bash</em>. W przypadku Debiana, <em>/bin/sh</em> jest
dowiązaniem do powłoki <em>DASH</em> bedąca tworem podobnym do
<em>KSH</em>. Takie skrypty zazwyczaj wykorzysują proste polecenie
oraz instrukcje bez specyficznych dla BASH mechanizmów.
</pre>
<p>
Teraz jeśli odbiorę uprawnienia wykonywania dla tego pliku to i tak
- będę wstanie go uruchomić. Poprzez uruchomienie pośrednie.
+ będę wstanie go uruchomić, poprzez uruchomienie pośrednie.
</p>
<pre class="code-block">
$ chmod -x test.sh
<p>
Głównym celem jaki przyświeca tworzeniu skryptów powłoki jest
automatyzacja powtarzalnych zadań wykonywanych w powłoce dystrybucji
- Linuxa. Zatem jej naprostszą oraz najbardziej złożoną instrukcją
+ Linuksa. Zatem jej najprostszą oraz najbardziej złożoną instrukcją
będzie najzwyklejszy uruchamiany przez nią program. Możemy dla
przykładu umieścić w skrypcie z poprzedniego podrozdziału polecenie
<em>ls</em>.
są <strong>zmienne</strong> - kontenery na dane, ułatwiające
zapisanie toku myślenia w postaci algorytmu. W programowaniu ma to
swoje odzwierciedlenie na pamięci, pozwalajac przypisać do
- niewielkich obszarów pamięci, identyfikatory aby móc sie odwołać w
+ niewielkich obszarów pamięci, identyfikatory aby móc odwołać się, w
kodzie źródłowym do ich zawartości.
</p>
<p>
</p>
<p>
Powyższy przykład ma duży potencjał optymalizacyjny swoją drogą,
- ponieważ pierwsze polecenie można pominąć i podać pliki odrazu
+ ponieważ pierwsze polecenie można pominąć i podać pliki od razu
poleceniu <code class="code-inline">grep</code>.
</p>
<h3 id="18.2.4.commandsubstitution">18.2.4. Podstawienie polecenia</h3>
# lub:
var=`grep 'xf0r3m' | sed 's,/bin/bash,/bin/sh,'`;
</pre>
- <h3 id="18.2.5.quotation">18.2.5. Znaki cytowania</h3>
+ <h3 id="18.2.5.subshellsubstitution">18.2.5. Wyrażenie nawiasów okrągłych</h3>
+ <p>
+ Wyrażenie nawiasów okrągłych lub podstawienie podpowłoki, umożliwia
+ nam oddzielenie wykonania pewnych poleceń od głównego procesu
+ podpowłoki wykonującego skrypt. Użycie tego mechinizmu sprawdza się
+ do zapisania, poleceń w zwykłym nawiasie okrągłym.
+ </p>
+<pre class="code-block">
+(cd ytfzf && make install doc)
+</pre>
+ <p>
+ Jest to szczególnie przydane, gdy musimy trzymać kurczowo jakiś
+ lokalizacji w systemie plików, a niektóre czynności tak jak
+ instalacja projektu pokazana na powyższym przykładzie wymaga
+ zmiany tej
+ ścieżki. Ścieżka może zostać zmieniona w podpowłoce i wykonanie
+ czynności
+ również. Nie będzie to miało wpływu na główny nurt działania skryptu.
+ </p>
+ <h3 id="18.2.6.quotation">18.2.6. 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:
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>
+ <h3 id="18.2.7.positionalparams">18.2.7. 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
wówczas wszysktie paramety są jednym elementem. Dostęp do parametrów
w ten sposób osiągamy poprzez - <strong>$*</strong>.
</p>
- <h3 id="18.2.7.parameterexpression">18.2.7. Wyrażenie parametru</h3>
+ <h3 id="18.2.8.parameterexpression">18.2.8. Wyrażenie parametru</h3>
<p>
Wyrażenie parametru posiada w BASH-u kilka funkcji. Jednak chyba
najważniejszą oraz tą, która wymaga zapamiętania jest separacja
<p>
Oczywiście poza funkcją separacyjną wyrażenie parametru kilka innych
zastosowań, jedno już zostało tutaj wymienione, jest to dostęp do
- parametrów pozycyjnych powyżej 10-tej pozycji.
+ parametrów pozycyjnych powyżej 10-tej pozycji. Pozostałe są dostępne
+ na stronie podręcznika powłoki BASH.
</p>
- <h3 id="18.2.8.exitcode">18.2.7. Exitcode - wartość zwracana przez program</h3>
+ <h3 id="18.2.9.exitcode">18.2.7. Exitcode - wartość zwracana przez program</h3>
<p>
Niektóre narzędzie wykorzystywane przez nas do pracy w dystrybucjach
Linuksa, zostają przez nas uruchomione i zaraz po tym zostaje nam
zwrócony znak zachęty. I tak naprawdę to nie wiemy czy program
wykonał swoje zadanie pomyślnie czy też nie. Nie mniej jednak
- większość programów działających na Uniksa zwraca takzwany kod
+ większość programów działających na Uniksach zwraca takzwany kod
wyjścia.
</p>
<ul>
<li><strong>0</strong> - program poprawnie wykonał swoje zadanie.</li>
<li><strong>!0</strong> - (wartość inna niż 0), podczas działania
- program nie mógł poprawnie wykonać swoich zadania z różnych
+ program nie mógł poprawnie wykonać swoich zadań z różnych
powodów.</li>
</ul>
<p>
<p>
Rozpoczynając omawianie wyrażeń warunkowych, warto sobie wyjaśnić,
że w BASH-u nie operujemy na wartościach logicznych. Na wartościach
- logicznych operują polecenie wykonujące sprawdzenie danego wyrażenia
+ logicznych operują polecenia wykonujące sprawdzenie danego wyrażenia
warunkowego. Na podstawie wyniku tego wyrażnia narzędzia te
<strong>generują kod wyjścia</strong>: <em>0</em> - dla
<strong>prawdy</strong> i <em>1</em> - dla <strong>fałszu</strong>.
plikiem.
</p>
<p>
- Warunki które wymagają dwóch operatorów, to zazwyczaj takie jakie
+ Warunki, które wymagają dwóch operatorów, to zazwyczaj takie jakie
znamy z lekcji matematyki: a > b, d <= e itd. Przyczym tutaj
warto przypomnień, że zapis instrukcji warunkowych (warunków), jest
jednocześnie zapisem polecenia, tak więc nie można użyć znaków
- mniejszości (<em><</em>) czy większości (<em>></em>),
+ mniejszości (<strong><</strong>) czy większości
+ (<strong>></strong>),
zamiast nich musimy używać specjalnie przygotowanych na tę okazję
zamienników:
</p>
<p>
Instukcje warunkowe na podstawie przekazanych przez programistę
warunków, zwracaja kod wyjscia, który najczęściej interpretowany jest
- przez konstrukcje warnukowe.
+ przez konstrukcje warunkowe.
</p>
<h3 id="18.3.2.if">18.3.2. Konstrukcje warunkowa - if</h3>
<p>
Konstrukcje warunkowe są elementem kontrolnym w programowaniu.
- Ich zadaniem jest wykonanie określonych instrukcji w determinowanych
+ Ich zadaniem jest wykonanie określonych instrukcji determinowanych
na podstawie przekazanej instrukcji warunkowej. I najprostszym tego
typu konstrukcją jest <em>if-then-else</em>.
</p>
zwrócić kod wyjścia. Po warunku <strong>obowiązkowo występuje średnik</strong>,
następnie słowo kluczowe <code class="code-inline">then</code>
otwierające blok kodu dla sytuacji, w której warunek zwrócił kod
- wyjścia <strong>równy 0</strong> (potocznie nazwywany prawdą). Po
+ wyjścia <strong>równy 0</strong> (potocznie nazywany prawdą). Po
tym bloku występuje słowo kluczowe
<code class="code-inline">else</code> otwierając tym samym blok
kodu dla każdej innej wartości kodu wyjścia, która nie jest zerem.
oraz całą konstrukcję.
</p>
<p>
- Konstrukcję <em>if-then-else</em> można rozszerzyć od dodatkowy
+ Konstrukcję <em>if-then-else</em> można rozszerzyć o dodatkowy
blok warunkowy <em>elif</em>. W momencie interpretacji takiej
konstrukcji BASH sprawdzi na początek warunek przy <em>if</em>
- następnie przy <em>elif</em> i jeśli oba te warunki oba te warunki
+ następnie przy <em>elif</em> i jeśli oba te warunki
zwrócą niezerowy kod wyjścia, wtedy zostaną wykonane instrukcje
zapisane w bloku <em>else</em>. Warto dodać, że nie ma limitu w
ilości dodatkowych warunków (<em>elif</em>) tworząc przy tym całą
tego przypadku.
</p>
<pre class="code-block">
-case $alphabet; in
+case $alphabet in
'a') echo "A";;
'b') echo "B";;
esac
pominięcie spowoduje błąd powłoki.
</p>
<p>
- Konstrukcja <em>Case</em> posiada przypadek uniwersalny
+ Konstrukcja <em>case</em> posiada przypadek uniwersalny
wykorzystywany gdy zmienna nie pasuje, do żadnego z przypadków.
Wartość takiego przypadku zapisuje się symbolem gwiazdki
(<strong>*</strong>).
</p>
<pre class="code-block">
-case $alphabet; in
+case $alphabet in
'a') echo "A";;
'b') echo "B";;
*) echo "To nie jest litera alfabetu";;
ograniczać do pojednczej wartości, ale może zawierać warianty.
</p>
<pre class="code-block">
-case $alphabet; in
+case $alphabet in
'a'|'A') echo "A";;
'b') echo "B";;
*) echo "To nie jest litera alfabetu";;
<p>
Pętle w programowaniu służa wykonywaniu powtarzalnych czynności
pod pewnym warunkiem. W bloku pętli element warunku
- (najprawdopodobniej) ulega zmiania, tak aby pętla zakończyła się
+ (najprawdopodobniej) ulega zmianie, tak aby pętla zakończyła się
i interpretacja programu wróciła na właściwy tor. Jeśli tak się nie
dzieje, to wówczas mamy doczynienia z nieskończoną pętlą, tego typu
- konstrukcje nie zawsze muszą oznaczać pełnego wykorzystania zasobów
- komputera, w zależności co znajduje się w ich bloku kodu. W BASH-u
+ konstrukcje nie zawsze muszą oznaczać błąd programisty, mogą być one
+ pożądne, w zależności co znajduje się w ich bloku kodu. W BASH-u
dość często wykorzystywane są dwa rodzaje pętli.
</p>
<h3 id="18.4.1.whileloop">18.4.1. Pętla while</h3>
zmiana jest użależniona od określonego warunku. Ze względu na to, iż
warunek pętli musi być prawdą, aby mogła ona w ogóle rozpocząć
działanie - licznik musi zostać zdefiniowany przed pętlą. Poniżej
- znajduje się przykładowa konstrukcja pętli while wyświetlająca
- kwadraty pierwszych 10 dodatnich liczb.
+ znajduje się przykładowa konstrukcja pętli <em>while</em>
+ wyświetlająca kwadraty pierwszych 10 dodatnich liczb.
</p>
<pre class="code-block">
count=1
done
</pre>
<p>
- W tym przypadku list została zapisana z ręki (<em>hardcoded</em>).
+ W tym przypadku lista 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.
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
+ też inny.
+ </p>
+ <p>
+ Kolejną z pętli jest <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
+ do której można się odwołać w bloku 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
+ w kodzie pętli zaimplementujemy warunek, że jeśli została
+ wybrana powiedzmy litera 'q', to zakończ pętle. 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>
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ą
+ 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
. functions.sh
</pre>
<p>
- Drugi sposób nie jest tożamy z takim zapisem jak:
+ Drugi sposób nie jest tożsamy 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.
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
+ wcześniej rozwiązanie związane z poleceniem <em>cut</em>
+ 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.
+ naprawdę kolumnami, więc należy 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.
+ podajemy po znaku dolara, tak jak na poniższym przykładzie.
</p>
<pre class="code-block">
... | awk '{printf $1}' | ...
strumieniu danych wejściowych.
</p>
<p>
- W plikach może zajść taka potrzeba aby zmienić pewien zapis tylko
- w jedenej linii, to wskazanie tej wybranej linii może odbyć się na
+ W plikach może zajść taka potrzeba, aby zmienić pewien zapis tylko
+ w jednej linii, to wskazanie tej wybranej linii może odbyć się na
dwa sposoby: za pomocą wyrażenia regularnego lub podając konkretny
- numer linii. Wyrażenie regularne sprawdzi sie przy kilku liniach, w
+ numer linii. Wyrażenie regularne sprawdzi się przy kilku liniach, w
przypadku jednej konkretnej, wystarczy podać jej numer.
</p>
<p>
Przy początkach naszej pracy ze skryptami, najczęściej będziemy
wykorzystywać raczej opcje <em>find and replace</em>, nie mniej
- jednak specyficzna składania polecenia <em>sed</em> wymaga aby
+ jednak specyficzna składania polecenia <em>sed</em> wymaga, aby
chociażby pokazać jak wyglądają polecenia <em>insert</em>,
<em>append</em> czy <em>print</em>.
</p>
<p>
Polecenie to domyślnie zwrócić na standardowe wyjście całą zawartość
pliku z podmienioną linią, ponieważ jest to edytor strumienia to
- musi on otwrzyć plik i działać na nim w pamięci. Aby nasze zamiany
- faktycznie miały jakiś skutek musimu dodać opcję <em>-i</em>.
+ musi on otworzyć plik i działać na nim w pamięci. Aby nasze zamiany
+ faktycznie miały jakiś skutek musimy dodać opcję <em>-i</em>.
</p>
<p>
Podobnie jest poleceniem <em>append</em> - <strong>a</strong>,
również wymaga ono opcji <em>-i</em>. Składania tego polecenia
- jest podobna nie mniej jednak zasada działania jest trochę inna.
+ jest identyczna z <em>insert</em>, zmianie ulega tylko literka
+ wskazująca polecenie, nie mniej jednak zasada działania jest
+ trochę inna.
Otóż to polecenie dopisze pod wskazaną linią, podaną wartość. W
przypadku naszego przykładu, podana wartość znalazła by się w 22
linii.
<h4>Polecenie sed - print</h4>
<p>
Za polecenie <em>print</em> odpowiedzialna jest litera <strong>p</strong>
- nie ma w tym nic dziwnego, nie mniej jednak warto zaznaczyć, że
+ nie ma w tym nic dziwnego, warto jednak zaznaczyć, że
polecenie to przyjmuje zakres linii do wyświetlania np. jesli
chcemy wyświetlić linie od 1 do 12, to wówczas możemy skorzystać z
poniższego polecenia:
$ sed '1,12p' test.txt
</pre>
<p>
- Tutaj istotną role pełni cytowanie. Jeśli checielibyśmy wyświetlić
+ Tutaj istotną rolę pełni cytowanie. Jeśli checielibyśmy wyświetlić
linie od 100 do końca pliku, to polecenie <em>sed</em> mogło by
- wyglądac w ten sposób: <code class="code-inline">'100,$p'</code>.
+ wyglądać w ten sposób: <code class="code-inline">'100,$p'</code>.
No dobrze, a jeśli początek zakresu jest zapisany w zmiennej to
polecenie powinno wyglądać mniej więcej tak
<code class="code-inline">"$a,$p"</code>. Problem w tym, że dolna
$ sed "s/ala/ola/" test.txt
</pre>
<p>
- Po polecenie <code class="code-inline">s</code> występuje separator,
+ Po poleceniu <code class="code-inline">s</code> występuje separator,
następnie wartość poszukiwana, znów separator oraz nowa wartość,
która zastąpi wartość poszukiwania, na końcu polecenia znów występuje
separator. Polecenie zamieni pierwsze wystąpienie ciągu