Z pogranicza » Linux

Interfejs uzytkownika - interpreter poleceń

  • 2015-05-20 16:18
  • 3 komentarze
  • 2999 odsłon
  • Oceń ten tekst jako pierwszy

LINUX - Interfejs użytkownika.

    <center>

4. INTERPRETER POLECEŃ

</center> <center>

Działanie interpretera poleceń

</center>        

W systemach UNIX i Linux interpreter poleceń określany jest również jako powłoka (ang. shell). Nazwa wywodzi się stąd, że program ten pełni rolę warstwy pośredniczącej między użytkownikiem a systemem operacyjnym. W dalszej części podręcznika będziemy posługiwać się zamiennie obydwoma określeniami.

        
(1.1) Przegląd interpreterów
        

Pierwszym interpreterem napisanym dla systemu UNIX był sh, czyli powłoka Bourne'a (ang. Bourne shell). Program ten odznacza się dużą szybkością działania i z tego względu jest wciąż powszechnie wykorzystywany do uruchamiania skryptów. Jego funkcjonalność jest niestety mocno ograniczona podczas pracy interaktywnej ze względu na brak licznych udogodnień, które oferują nowocześniejsze powłoki.

        

Znacznie wygodniejszy jest drugi klasyczny interpreter csh (ang. C shell). Program csh oferuje m.in. historię poleceń, aliasy, i sterowanie pracami. Składnia złożonych poleceń jest bardzo zbliżona do języka C (w którym został napisany) i różni się znacząco od składni stosowanej w sh.

        

Trzecim klasycznym interpreterem jest ksh (ang. Korn shell), stanowiący rozszerzenie programu sh o wiele nowych funkcji. Z założenia, ksh przeznaczony był dla administratorów i raczej nie zdobył uznania zwykłych użytkowników ze względu na skomplikowaną składnię.

        
Żaden z wymienionych programów nie jest dostępny w klasycznej wersji w systemie Linux.
        

Obecnie największą popularność cieszą się nowoczesne interpretery łączące duże możliwości z łatwością obsługi. Należy tu wymienić powłoki zsh i bash (ang. Bourne Again shell), powstałe z rozwinięcia sh, oraz powłokę tcsh. Powłoka zsh staje się powoli standardem systemu UNIX, zaś bash jest od samego początku podstawowym i domyślnym interpreterem Linuxa.

        

W dalszej części tej lekcji opisujemy powłokę bash.

        
(1.2) PLiki konfiguracyjne
        

Powłoka bash może wykorzystać kilka plików konfiguracyjnych w zależności od sposobu uruchomienia.

        

Powłoka uruchomiona po zalogowaniu użytkownika (ang. login shell) odczytuje kolejno zawartość następujących plików:

        
  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile
        


             Każda powłoka interaktywna odczytuje zawartość plików:

        
  • /etc/bashrc
  • ~/.bashrc
        
(1.3) Edycja poleceń
        

Powłoka bash daje bogate możliwości edycji poleceń. Pozwala łatwo modyfikować wpisane polecenie poprzez przemieszczanie się kursorami ARROW_L.GIF i ARROW_R.GIF w wierszu, usuwanie niepoprawnych znaków i wstawianie nowych. Jest to szczególnie przydatne do poprawiania długich poleceń złożonych z wielu wyrazów, w których błąd popełniono na samym początku. Opisany poniżej mechanizm historii pozwala przywołać takie polecenie, poprawić i ponownie wykonać.

        

Interpreter umożliwia ponadto uzupełnianie nazw poleceń i plików podczas edycji wiersza polecenia. Po wprowadzeniu początkowego fragmentu nazwy polecenia można wcisnąć [Tab], aby powłoka odnalazła i uzupełniła nazwę. Poszukiwania prowadzone są wśród wbudowanych poleceń oraz w katalogach wymienionych w ścieżce poszukiwań programów PATH. Podobnie odbywa się uzupełnianie nazw plików z tym, że poszukiwania dotyczą tylko jednego katalogu wskazanego w początkowym fragmencie nazwy ścieżkowej pliku (domyślnie jest to katalog bieżący). W obydwu przypadkach, jeśli bash odnajdzie kilka pasujących nazw, to wyświetla ich listę dając użytkownikowi możliwość wyboru.

        

Po zakończeniu edycji użytkownik zatwierdza polecenie wciskając [Enter].

        
(1.4) Wartościowanie i wykonywanie poleceń
        

Każde polecenie wydane przez użytkownika jest analizowane przez interpreter, rozwijane do pełnej postaci i dopiero wykonywane. Interpreter wykonuje kolejno następujące operacje:

        
  • podstawia wartości zmiennych (interpretacja znaku $),
  • podstawia wyniki poleceń (interpretacja znaków `</b>), <li>dokonuje podziału na nazwę polecenia i argumenty (interpretacja separatorów), <li>wykonuje przekierowanie strumieni danych, <li>rozwija nazwy plików, <li>rozpoznaje i wykonuje polecenie. </ul> Jeśli interpreter rozpozna nazwę funkcji lub wbudowanego polecenia, to sam je wykonuje. Jeżeli rozpozna nazwę programu lub skryptu, to uruchamia go jako nowy proces potomny. <p>Każde polecenie zwraca swój status zakończenia. Przyjęto konwencję, że zerowy status oznacza pomyślne zakończenie, zaś wartość niezerowa jest zwracana, gdy polecenia nie udało się wykonać. Jeśli polecenie zostało przerwane przez sygnał o numerze <b>n</b>, to zwracana jest wartość<b> 128 +</b> <b>n</b>.</p> <h5><b>(1.5) Historia wydawanych poleceń</b></h5> <p>Interpreter może przechowywać listę ostatnio wydanych poleceń i udostępniać je użytkownikowi do powtórnego wykorzystania. Mechanizm ten nosi nazwę historii poleceń.</p> <h5>Oryginalna powłoka Bourne'a <tt>sh</tt> nie ma wbudowanego mechanizmu historii.</h5> <p>Powłoka <b>bash</b> udostępnia historię poleceń, jeśli ustawiona jest opcja <b>history </b>(patrz punkt 2.5). Liczbę pamiętanych poleceń określa zmienna <b>HISTSIZE</b> ustawiana domyślnie na wartość 500. Po uruchomieniu, bash zaczyna pracę z pustą listą historii, ale może ją zainicjować z pliku określonego zmienną <b>HISTFILE</b>. Domyślnie jest to plik<b> ~/.bash_history</b>. Maksymalną liczbę linii w pliku określa zmienna <b>HISTFILESIZE</b>.</p> <p>Aktualną listę historii można wypisać poleceniem <b>history</b>. Każde z zapamiętanych poleceń poprzedzone jest swoim numerem. Posługując się tym numerem lub początkowym fragmentem nazwy, można przywołać konkretne polecenie w następujący sposób:</p> <table border=0 nosave cellpadding="1" cellspacing="5"> <tr> <td><b>!identyfikator</b></td> <td>-</td> <td>ogólna postać odwołania do historii poleceń,</td> </tr> <tr> <td><b>!!</b></td> <td>-</td> <td>przywołuje ostatnie polecenie,</td> </tr> <tr> <td><b>!n</b></td> <td>-</td> <td>przywołuje polecenie o numerze n,</td> </tr> <tr> <td><b>!-n</b></td> <td>-</td> <td>przywołuje polecenie położone n pozycji od końca listy czyli od ostatniego polecenia,</td> </tr> <tr> <td><b>!string</b></td> <td>-</td> <td>przywołuje polecenie rozpoczynające się ciągiem znaków string.</td> </tr> </table> <p>Istnieje też drugi sposób korzystania z historii poleceń, który w większości przypadków jest znacznie wygodniejszy.<br> Powłoka <b>bash</b> umożliwia przeglądanie listy w linii poleceń przy użyciu kursorów <img src="http://mion.elka.pw.edu.pl/lfronczy/GIF/ARROW_U.GIF" width="8" height="19" border="0"> oraz <img src="http://mion.elka.pw.edu.pl/lfronczy/GIF/ARROW_D.GIF" width="7" height="18" border="0">. Przywołane polecenie można potem modyfikować jak opisano w punkcie 1.3.</p> <h5><b>(1.6) Aliasy</b></h5> <p>Istotne ułatwienie do wielokrotnego posługiwania się złożonymi poleceniami wnoszą <b><font color="maroon">aliasy</font></b>. Umożliwiają zastąpienie wieloczłonowego polecenia pojedyńczym wyrazem. Nową nazwą można się posługiwać tak, jak każdym innym poleceniem, dodając opcje i argumenty. Nie ma jednak możliwości wstawienia zmiennych argumentów do tekstu samego aliasu.</p> <h5>Mechanizm aliasów jest dostępny w większości interpreterów (z wyjątkiem <tt>sh</tt>), ale tylko w tych egzemplarzach, które zostały uruchomione w trybie interaktywnym. W związku z tym aliasy nie są na ogół dostępne w skryptach.</h5> <p>Każda uruchomiona powłoka przechowuje niezależnie własną listę aliasów zdefiniowanych przy pomocy wbudowanego polecenia:</p> <h6>alias [-p] [nazwa=wartość ...]</h6> <h6>alias [nazwa ...]</h6> <p>Polecenie wywołane bez argumentów lub z opcją <b>-p</b> wypisuje pełną listę aliasów. Jeśli podane są tylko nazwy aliasów, powłoka wypisuje ich wartości. Dla argumentów w postaci nazwy z przypisaną wartością tworzone są nowe aliasy. Jeżeli przypisywana wartość składa się z kilku wyrazów (np. polecenie z opcjami i argumentami), to należy podać ją w cudzysłowach bądź apostrofach np.:</p> <p><em class="przyklad">alias ll=&quot;ls -l&quot;</em></p> <p><em class="przyklad">alias l='ls -FC'</em></p> <p>Aliasy zwykle ustawiane są w plikach konfiguracyjnych odczytywanych przez powłoki interaktywne, czyli w plikach: <b>/etc/bashrc</b> i <b>~/bashrc</b>.</p> <p>Usuwanie aliasów umożliwia polecenie: </p> <h6>unalias [-a] [nazwa ...]</h6> <dl> <center><h4>Konfigurowanie interpretera</h4></center> <p>Sposób działania interpretera jest w dużym stopniu ustalany przez <b><font color="maroon">parametry</font></b> i <b><font color="maroon">opcje</font></b>.</p> <h5><b>(2.1) Parametry</h5></b> <p>Parametry są instancjami przechowującymi wartości. Mogą być reprezentowane przez nazwę w postaci ciągu znaków, liczbę naturalną lub jeden ze znaków specjalnych.</p> <p>Parametry reprezentowane przez liczbę naturalną noszą nazwę <b><font color="maroon">parametrów pozycyjnych</font> </b>i przechowują argumenty wywołania powłoki.</p> <p><b><font color="maroon">Parametry specjalne</font></b> mają postać pojedyńczych znaków specjalnych a ich wartości są automatycznie ustawiane i modyfikowane dynamicznie przez powłokę.</p> <p>Parametry reprezentowane przez nazwę określane są jako <b><font color="maroon">zmienne</font></b>. Ustawianie wartości zmiennych odbywa się za pomocą jednego z trzech poleceń:</p> <h6>zmienna=[wartość]</h6> <h6>typeset zmienna=[wartość]</h6> <h6>declare zmienna=[wartość]</h6> <p>Jeśli wartość zostanie pominięta, to zmiennej zostanie przypisany zerowy ciąg znaków.</p> <p>Usunięcie zmiennej umożliwia polecenie:</p> <h6>unset zmienna</h6> <p>Zmienne można podzielić na dwie kategorie:</p> <ol> <li><b><font color="maroon">zmienne środowiska</font></b>, <li><b><font color="maroon">zmienne lokalne powłoki</font></b>. </ol> Listę wszystkich zmiennych, zarówno lokalnych jak i środowiska, uzyskamy poleceniem: <h6><tt>set</tt></h6> <p>Odwołanie do wartości dowolnego parametru następuje za pomocą znaku $ w następujący sposób:</p> <h6><tt>$parametr</tt></h6> <h6><tt>${parametr}</tt></h6> <p>Postać z nawiasami jest konieczna, gdy w poleceniu bezpośrednio za nazwą parametru chcemy umieścić inne znaki oraz gdy nazwa liczbowa składa się z więcej niż jednej cyfry.</p> <p><b><em class="przyklad"><u>Przykład</u></em></b></p> <p><em class="przyklad"><tt>[[email protected]]$ x=abc&lt;br&gt;[[email protected]]$ echo $x&lt;br&gt; abc&lt;br&gt;[[email protected]]$ echo $x123</tt></em></p> <p><em class="przyklad"><tt>[[email protected]]$ echo ${x}123&lt;br&gt; abc123</tt><br> </em></p> <p> </p> <h5><b>(2.2) Zmienne środowiska</h5></b> <p>Każdy tworzony proces, w tym również każda powłoka, otrzymuje nowe <b><font color="maroon">środowisko</font></b> w postaci tablicy zawierającej ciągi znaków <b>zmienna=wartość</b>. Każdy taki ciąg oznacza utworzenie nowej <b>zmiennej środowiska</b>. </p> <p>Ten początkowy zestaw zmiennych środowiska jest <b>dziedziczony</b> po procesie macierzystym, którym najczęściej jest powłoka uruchamiająca nowy program.</p> <p>W trakcie działania procesu środowisko może być modyfikowane poprzez usuwanie i dodawanie nowych zmiennych oraz przez zmiany ich wartości. Wszystkie modyfikacje znajdują odzwierciedlenie we wspomnianej tablicy. Zmiany te jednak nie przenoszą się do procesu macierzystego. Zasada ta dotyczy również procesów potomnych danego procesu utworzonych przed modyfikacją środowiska.</p> <p><b>Zmienne środowiska wyróżnia więc to, że nie są związane tylko z lokalną powłoką, ale są dziedziczone przez wszystkie procesy potomne tworzone przez powłokę.</b></p> <p>Są wykorzystywane przez różne procesy a nie tylko przez proces powłoki. Nie można ich jednak traktować jako zmienne globalne, gdyż nie stają się widoczne dla wszystkich procesów.</p> <p>Całe środowisko można wyświetlić przy pomocy poleceń:</p> <h6> printenv</h6> <p>lub</p> <h6>env </h6> <p>Wartość pojedyńczej zmiennej wypisze polecenie: </p> <h6>echo $zmienna</h6> <p> Dodanie do środowiska nowej zmiennej polega na wyeksportowaniu zmiennej lokalnej, której trzeba wcześniej przypisać właściwą wartość: </p> <h6>zmienna=wartość</h6> <h6>export zmienna</h6> <p> Można to również zrobić w jednym etapie wydając polecenie: </p> <h6>export zmienna=wartość</h6> <p> Zmienną środowiska można usunąć poleceniem <tt>&lt;b&gt;unset&lt;/b&gt;</tt>, podobnie jak zmienną lokalną.</p> <p>W tablicy 4.1 zebrano najważniejsze zmienne środowiska definiowane w każdej powłoce i wyjaśniono ich znaczenie dla powłoki i innych procesów.</p> <div align="center"> <table border=2 cellpadding="2" cellspacing="2" bgcolor="#fffff0"> <caption><font size="+1"><b>Tablica 4.1</b> Najważniejsze zmienne środowiska</font></caption> <tr> <td> <center> <font size="+1"><b> Nazwa zmiennej</b></font></center> </td> <td> <center> <font size="+1"><b> Znaczenie</b></font></center> </td> </tr> <tr> <td>LOGNAME</td> <td>Nazwa zalogowanego użytkownika.</td> </tr> <tr> <td>USER</td> <td>Nazwa zalogowanego użytkownika.</td> </tr> <tr> <td>HOME</td> <td>Katalog domowy zalogowanego użytkownika.</td> </tr> <tr> <td>LANG</td> <td>Język lokalny.</td> </tr> <tr> <td>PATH</td> <td>Ścieżka poszukiwań programów.</td> </tr> <tr> <td>CDPATH</td> <td>Ścieżka poszukiwań katalogów.</td> </tr> <tr> <td>MANPATH</td> <td>Ścieżka poszukiwań dokumentacji systemowej.</td> </tr> <tr> <td>LD_LIBRARY_PATH</td> <td>Ścieżka poszukiwań bibliotek dynamicznych.</td> </tr> <tr> <td>PWD</td> <td>Katalog bieżący.</td> </tr> <tr> <td>SHELL</td> <td>Powłoka uruchamiana po zalogowaniu użytkownika.</td> </tr> <tr> <td>TERM</td> <td>Typ terminala.</td> </tr> <tr> <td>MAIL</td> <td>Skrzynka pocztowa zalogowanego użytkownika.</td> </tr> <tr> <td>MAILCHECK</td> <td>Częstotliwość sprawdzania skrzynki pocztowej.</td> </tr> <tr> <td>IFS</td> <td>Wejściowy separator pola.</td> </tr> <tr> <td>TZ</td> <td>Strefa czasowa.</td> </tr> </table> </div> <p></p> <h5><b>(2.3) Zmienne lokalne powłoki</h5></b> <p><b>Zmienne lokalne</b> mają znaczenie wyłącznie dla bieżącej powłoki i tylko w niej są widoczne. <b>Nie podlegają dziedziczeniu i nie mogą być wykorzystane przez inne procesy. </b>Sposób definiowana i usuwania zmiennych opisano powyżej. W tablicy 4.2 opisane zostały wybrane zmienne powłoki.</p> <p></p> <div align="center"> <table border=2 nosave cellpadding="2" cellspacing="2" bgcolor="#fffff0" width="95%"> <caption> <center> <font size="+1"><b>Tablica 4.2</b> Wybrane zmienne lokalne powłoki bash</font></center> </caption> <tr> <td > <center> <font size="+1"><b>Nazwa zmiennej</b></font></center> </td> <td> <center> <font size="+1"><b>Znaczenie</b></font></center> </td> </tr> <tr> <td>BASH</td> <td>Pełna nazwa ścieżkowa interpretera poleceń.</td> </tr> <tr> <td>HISTFILE</td> <td>Nazwa pliku przechowującego historię wydawanych poleceń.</td> </tr> <tr> <td valign=TOP>HISTFILESIZE</td> <td valign=TOP>Maksymalna liczba linii w pliku historii poleceń.</td> </tr> <tr> <td>HISTSIZE</td> <td>Liczba pamiętanych poleceń.</td> </tr> <tr> <td>PS1</td> <td>Podstawowy komunikat gotowości powłoki wyświetlany, gdy powłoka jest gotowa do przyjęcia kolejnego polecenia.</td> </tr> <tr> <td>PS2</td> <td>Wtórny komunikat gotowości powłoki wyświetlany, gdy powłoka oczekuje na dokończenie polecenia w następnej linii.</td> </tr> </table> </div> <p>Zmienne PS1 i PS2 mogą być również ustawione jako zmienne środowiska. Definiują one sposób, w jaki powłoka zgłasza gotowość do dalszej pracy. Jeśli powłoka jest gotowa do przyjęcia kolejnego polecenia, to wyświetla <b>komunikat gotowości</b> zawierający ciąg znaków przypisany zmiennej PS1. Jeśli powłoka wymaga jeszcze dodatkowych danych wejściowych, żeby dokończyć polecenie, to wyświetla ciąg znaków przypisany zmiennej PS2. Podstawowe komunikaty zawierają tylko jeden znak, odpowiednio <b>$</b> lub <b>&gt;</b>. Stąd wywodzi się inna nazwa takiego komunikatu - <b>znak zachęty</b> powłoki. Najczęściej stosuje się jednak dłuższe komunikaty, które mogą zawierać nazwę komputera, nazwę użytkownika, nazwę bieżącego katalogu czy numer polecenia.</p> <p><em class="przyklad"><b><u>Przykład</u></b></em></p> <p><em class="przyklad">Poniżej przedstawiono przykładowe wartości zmiennych PS1 i PS2 oraz ich efekt w postaci komunikatów gotowości powłoki.</em></p> <p><em class="przyklad">[[email protected] apw]$ echo $PS1</em></p> <p><em class="przyklad">[\u@\h \W]\$</em></p> <p><em class="przyklad">[[email protected] apw]$ echo $PS2</em></p> <p><em class="przyklad">&gt;</em></p> <p></p> <p> <h5><b>(2.4) Parametry specjalne</h5></b> </p> <p>Każda powłoka ustawia automatycznie kilka parametrów specjalnych, których wartości zmieniają się w trakcie jej działania. W tablicy 4.3 przedstawiamy znaczenie tych parametrów.</p> <div align="center"> <table border cols=2 nosave bgcolor="#fffff0"> <caption><font size="+1"><b>Tablica 4.3</b> Parametry specjalne powłoki bash</font></caption> <tr> <td> <center> <font size="+1"><b>Parametr</b></font></center> </td> <td> <center> <font size="+1"><b>Znaczenie</b></font></center> </td> </tr> <tr> <td>#</td> <td>Liczba parametrów pozycyjnych.</td> </tr> <tr> <td>*</td> <td>Lista parametrów pozycyjnych w postaci jednego ciągu znaków.</td> </tr> <tr> <td>@</td> <td>Lista parametrów pozycyjnych w postaci oddzielnych ciągów znaków.</td> </tr> <tr> <td>?</td> <td>Status zakończenia ostatnio uruchomionego polecenia.</td> </tr> <tr> <td>$</td> <td>PID bieżącej powłoki.</td> </tr> <tr> <td>!</td> <td>PID procesu ostatnio uruchomionego w tle.</td> </tr> <tr> <td>-</td> <td>Lista opcji bieżącej powłoki.</td> </tr> </table> </div> <p>Parametr <b>$? </b>umożliwia sprawdzenie w skrypcie, czy jakieś polecenie zakończyło się pomyślnie. Parametr <b>$$</b> zawiera identyfikator PID bieżącej powłoki, który można wykorzystać np. do stworzenia pliku tymczasowego o unikalnej nazwie.</p> <p></p> <p> <h5><b>(2.5) Parametry pozycyjne</h5></b> </p> <p>Parametry pozycyjne reprezentowane są przez kolejne liczby naturalne.<br> Parametr <b>$0</b> przechowuje nazwę powłoki lub nazwę skryptu. Parametry <b>$1</b>, <b>$2</b>, <b>$3</b> ... przechowują kolejne argumenty. Odwołania do parametrów o wyższych numerach, składających się z kilku cyfr, wymagają użycia nawiasów klamrowych:<b> ${10}</b>, <b>${11}</b> ... Powłoka <b>bash</b> nie ogranicza więc możliwości bezpośredniego dostępu do wszystkich parametrów, podczas gdy w powłoce <b>sh</b> istnieje ograniczenie tylko do pierwszych 9 parametrów: <b>$1, ... $9</b> a dostęp do pozostałych otrzymuje się po przesunięciu.</p> <p>Wszystkie parametry pozycyjne można jednocześnie przesunać w lewo o dowolną liczbę pozycji za pomocą polecenia: </p> <h6>shift [n] </h6> <p>Gdy argument nie jest podany, domyślnie następuje przesunięcie wszystkich parametrów o <b>jedną pozycję</b>. W rezultacie parametr $1 jest usuwany (bezpowrotnie), parametr $2 przesuwa się na $1, parametr $3 na $2 itd. W przypadku gdy parametr <b>n</b> jest podany przesuwanie argumentów następuje o <i>n</i> pozycji, tzn. <i>n </i>pierwszych argumentów jest usuwanych a pozostałe zajmują pozycje zaczynając od $1.</p> <h5>Parametr $0 nigdy nie podlega przesunięciu i zawsze przechowuje nazwę.</h5> <p>Powłoka ustawia również trzy parametry specjalne związane z parametrami pozycyjnymi. Parametr <b>$#</b> określa liczbę ustawionych parametrów pozycyjnych z wyjatkiem parametru $0. Parametr <b>$*</b> przechowują całą listę parametrów pozycyjnych w postaci jednego ciągu znaków &quot;$1 $2 $3 ...&quot;, natomiast <b>$@</b> przechowuje tę listę w postaci oddzielnych ciągów &quot;$1&quot; &quot;$2&quot; &quot;$3&quot; ...</p> <p>Początkowe ustawienie parametrów pozycyjnych można zmienić poleceniem: </p> <h6>set arg1 arg2 arg3 ... </h6> <p>Polecenie zmienia na raz wszystkie parametry pozycyjne, usuwając stare wartości i przypisując części z nich nowe wartości podane w poleceniu. Nie ma możliwości zmiany tylko wybranych parametrów. </p> <p> <h5><b>(2.6) Opcje</h5></b> </p> <p>Dodatkową możliwość konfiguracji interpretera zapewniają opcje. Można je ustawić podając odpowiednie argumenty przy wywołaniu powłoki albo w trakcie jej działania posłużyć się poleceniem: </p> <h6>set -o [opcja ...] </h6> <p>Polecenie wydane bez argumentów wypisuje aktualne ustawienia poszczególnych opcji.</p> <p>Usuwanie opcji umożliwia polecenie: </p> <h6>set +o [opcja ...] </h6> <p>Większość opcji ma swoje jednoliterowe odpowiedniki, których można użyć przy uruchamianiu powłoki. Niektóre opcje są domyślnie ustawiane przez powłokę. W tablicy 4.4 podano nazwy, skróty literowe oraz znaczenie wybranych opcji:</p> <p></p> <div align="center"> <table border cols=2 bgcolor="#fffff0" width="95%"> <caption><font size="+1"><b>Tablica 4.4</b> Wybrane opcje powłoki bash</font></caption> <tr> <td valign=TOP > <center> <font size="+1"><b>Nazwa opcji <br> (skrót literowy)</b></font></center> </td> <td valign=middle> <center> <font size="+1"><b> Znaczenie</b></font></center> </td> </tr> <tr> <td valign="top">history</td> <td>Powłoka udostępnia mechanizm historii. W powłokach interaktywnych jest ustawiona domyślnie.</td> </tr> <tr> <td valign="top">ignoreeof</td> <td>Ignorowanie przez powłokę znaku końca pliku (ctrl d).</td> </tr> <tr> <td valign="top">monitor (-m)</td> <td>Powłoka udostępnia sterowanie pracami.</td> </tr> <tr> <td valign="top">noclobber (-C)</td> <td>Powłoka nie nadpisuje istniejących plików w wyniku przekierowania strumieni (&gt;, &gt;&amp;). Można wymusić nadpisanie poprzez użycie &gt;!.</td> </tr> <tr> <td valign="top">notify (-b)</td> <td>Powłoka natychmiast informuje o zakończeniu procesu w tle. Gdy opcja nie jest ustawiona, wypisuje informacje po wydaniu następnego polecenia.</td> </tr> <tr> <td valign="top">noglob (-f)</td> <td>Powłoka nie rozwija nazw plików zawierających znaki specjalne.</td> </tr> <tr> <td valign="top">emacs</td> <td>Powłoka używa stylu edytora <b>emacs</b> do edycji linii poleceń. Dopuszczane jest przemieszczanie się kursorami i wstawianie znaków.</td> </tr> <tr> <td valign="top">vi</td> <td>Powłoka używa stylu edytora <b>vi</b> do edycji linii poleceń. Opcja ta wyklucza się wzajemnie z opcją emacs.</td> </tr> <tr> <td valign="top">xtrace (-x)</td> <td>Powłoka wypisuje każde polecenie w postaci rozwiniętej przed jego wykonaniem. Umożliwia w ten sposób śledzenie wykonywania poleceń.</td> </tr> </table> </div> <p></p> <center><h4>Interpretacja znaków specjalnych przez powłokę</h4></center> <h5><b>(3.1) Rozwijanie nazw plików</b></h5> </p> <p>Każdy interpreter dopuszcza stosowanie w nazwach plików specjalnych znaków, które mogą zastępować jeden lub więcej dowolnych znaków. Otrzymuje się w ten sposób wzorce pasujące do nazw kilku plików. Poniżej przedstawiono zestaw znaków specjalnych powłoki <b>bash</b>:</p> <table border="0" cellpadding="1" cellspacing="5"> <tr> <td><b>?</b></td> <td><b>-</b></td> <td>zastępuje jeden dowolny znak,</td> </tr> <tr> <td><b>*</b></td> <td><b>-</b></td> <td>zastępuje dowolny ciąg znaków,</td> </tr> <tr> <td><b>[ ]</b></td> <td><b>-</b></td> <td>zastępuje jeden znak z listy podanej wewnątrz nawiasów,</td> </tr> <tr> <td><b>[ - ]</b></td> <td><b>-</b></td> <td>zastępuje jeden znak z zakresu podanego wewnątrz nawiasów,</td> </tr> <tr> <td ><b>[^ ] lub [! ]</b></td> <td><b>-</b></td> <td>zastępuje dowolny znak oprócz tych podanych wewnątrz nawiasów.</td> </tr> </table> <p></p> <p><em class="przyklad"><b><u>Przykład.</u></b></em></p> <p><em class="przyklad">ls *.[hc]</em></p> <p> <h5><b>(3.2) Cytowanie</b></h5> </p> <p>Cytowanie stosowane jest w celu usunięcia specjalnego znaczenia niektórych znaków i słów. Zapobiega interpretacji tych znaków przez powłokę, przywracając ich podstawowe znaczenie. Niektóre sposoby cytowania dopuszczają pewne wyjątki:</p> <table border="0" cellpadding="1" cellspacing="5"> <tr> <td><b><font size="+1">\</font></b></td> <td><b>-</b></td> <td>zapobiega interpretacji następnego znaku,</td> </tr> <tr> <td ><b><font size="+1">&quot; &quot;</font></b></td> <td><b>-</b></td> <td>zapobiegają interpretacji wszystkich znaków zawartych wewnątrz cudzysłowów, z wyjątkiem znaków <b>$</b> i <b></b>,</td> </tr> <tr> <td><b><font size="+1">' '</font></b></td> <td><b>-</b></td> <td>zapobiegają interpretacji wszystkich znaków zawartych wewnątrz apostrofów,</td> </tr> <tr> <td><b><font size="+1"> </font></b></td> <td><b>-</b></td> <td>wykonuje polecenie zawarte wewnątrz znaków i wstawia w to miejsce strumień wyjściowy tego polecenia.</td> </tr> </table> <p><em class="przyklad"><b><u>Przykład.</u></b></em></p> <p><em class="przyklad">echo &quot;date $pwd&quot;</em></p> <p> <h5><b>(3.3) Grupowanie poleceń</b></h5> </p> <p>Interpreter umożliwia jednoczesne wydanie kilku poleceń w jeden linii. Sposób zgrupowania zdecyduje o tym, w jaki sposób i w jakiej kolejności powloka wykona te polecenia. Poniżej przedstawiono kilka możliwości połączenia poleceń w jednej linii oraz efekty takiego użycia (skrót <b>cmd</b> oznacza dowolne polecenie):</p> <table border="0" width="100%" cellpadding="1" cellspacing="5"> <tr> <td ><b>cmd ; cmd ; cmd</b></td> <td>-</td> <td>powłoka grupuje polecenia na pierwszym planie wykonując je sekwencyjnie,</td> </tr> <tr> <td ><b>cmd &amp; cmd &amp; cmd &amp;</b></td> <td>-</td> <td>powłoka grupuje polecenia w tle wykonując je asynchronicznie,</td> </tr> <tr> <td ><b>cmd | cmd | cmd</b></td> <td>-</td> <td>powłoka grupuje polecenia wykonując je w potoku,</td> </tr> <tr> <td ><b>(cmd ; cmd)</b></td> <td>-</td> <td>powłoka grupuje polecenia i wykonuje w nowej powłoce,</td> </tr> <tr> <td ><b>{ cmd ; cmd ; }</b></td> <td>-</td> <td>powłoka grupuje polecenia i wykonuje w bieżącej powłoce, tworzy jeden strumień wyjściowy dla całej grupy poleceń i zwraca jeden status zakończenia.</td> </tr> </table> <p></p> <p> <h5><b>(3.4) Przekierowanie strumieni</b></h5> </p> <p>Powłoka związuje z każdym tworzonym procesem trzy strumienie danych:</p> <ol> <li type="1">standardowy strumień wejciowy <b><font color="maroon">stdin</font></b>, <li type="1">standardowy strumień wyjciowy <b><font color="maroon">stdout</font></b>, <li type="1">standardowy strumień błędów (diagnostyczny) <b><font color="maroon">stderror</font></b>. </ol> Każdy ze strumieni związany jest z plikiem zwykłym lub z plikiem urządzenia wejścia/wyjścia. Domyślnym przywiązaniem dla wszystkich strumieni jest plik terminala. <p>Każdy plik otwarty przez proces otrzymuje kolejny numer zwany <b><font color="maroon">deskryptorem</font></b> pliku. Deskryptory<b> 0</b>, <b>1 </b>i <b>2 </b>zarezerwowane są dla plików związanych ze standardowymi strumieniami.</p> <p>Przed wykonaniem dowolnego polecenia można zmienić domyślne przywiązanie strumieni, czyli przekierować wejście i wyjście z polecenia. Przekierowania strumieni w powłoce <b>bash</b> obejmują następujące operacje:</p> <table border="0" cellpadding="1" cellspacing="5" width="100%"> <tr> <td valign="top"><b>[d]&lt;plik</b></td> <td valign="top">-</td> <td>przekierowanie wejścia powoduje otwarcie pliku do czytania z deskryptorem <b>d</b>; jeżeli <b>d</b> zostało pominięte przyjmowane jest 0,</td> </tr> <tr> <td valign="top"><b>[d]&gt;plik</b></td> <td valign="top">-</td> <td>przekierowanie wyjścia powoduje otwarcie pliku do pisania z deskryptorem <b>d</b>; jeżeli <b>d</b> zostało pominięte przyjmowane jest 1,</td> </tr> <tr> <td valign="top"><b>[d]&gt;&gt;plik</b></td> <td valign="top">-</td> <td>przekierowanie wyjścia powoduje otwarcie pliku do dopisywania z deskryptorem <b>d</b>; jeżeli <b>d</b> zostało pominięte, przyjmowane jest 1,</td> </tr> <tr> <td valign="top"><b>[d]&lt;&gt;plik</b></td> <td valign="top">-</td> <td>przekierowanie powoduje otwarcie pliku do czytania i pisania z deskryptorem <b>d,</b></td> </tr> <tr> <td valign="top"><b>&amp;&gt;plik lub &gt;&amp;plik</b></td> <td valign="top">-</td> <td>przekierowanie powoduje skierowanie strumienia wyjściowego i strumienia błędów do tego samego pliku,</td> </tr> <tr> <td valign="top"><b>[d1]&gt;&amp;d2</b></td> <td valign="top">-</td> <td>przekierowanie powoduje zduplikowanie deskryptora pliku wyjściowego; deskryptor <b>d1</b> staje się kopią deskryptora <b>d2</b> i wskazuje na ten sam plik.</td> </tr> </table> <p>Jeżeli numer deskryptora <b>d</b> zostanie pominięty, to powłoka domyślnie przyjmie deskryptor <b>0 (stdin)</b> lub <b>1 (stdout)</b> w zależności od rodzaju przekierowania.</p> <p>Operatory przekierowania można umieścić w linii polecenia zarówno przed jak i za poleceniem. Przekierowania wykonywane są w kolejnosci występowania licząc od lewej do prawej.</p> <p></p> <p> <h5><b>(3.5) Inne</b></h5> </p> <p>Interpreter korzysta jeszcze z kilku innych znaków specjalnych, które zostały już wprowadzone we wcześniejszej części tego podręcznika Dla przypomnienia przytaczamy je również w tym miejscu:</p> <table border="0" cellpadding="1" cellspacing="5"> <tr> <td><b>spacja, tabulator, znak nowej linii</b></td> <td>-</td> <td>separatory rozdzielające poszczególne elementy polecenia,</td> </tr> <tr> <td><b>~</b></td> <td>-</td> <td>katalog domowy użytkownika,</td> </tr> <tr> <td><b>$</b></td> <td>-</td> <td>podstawienie wartości parametru (zmiennej),</td> </tr> <tr> <td><b>!</b></td> <td>-</td> <td>odwołanie do mechanizmu historii.</td> </tr> </table> <p></p> <center><h4>Skrypty</h4></center> <p>Plik tekstowy zawierający listę poleceń dla interpretera nosi nazwę <b>skryptu</b>. Skrypty tworzone są w celu ułatwienia użytkownikom pracy z interpreterem. Umożliwiają zapisanie często używanych sekwencji poleceń i zastąpienie ich jednym poleceniem uruchomienia skryptu. Są szczególnie przydatne dla administratora systemu, który wielokrotnie wykonuje powtarzające się czynnosci, takie jak zakładanie kont nowym użytkownikom, tworzenie kopii zapasowych.</p> <p>Skrypt może zawierać:</p> <ul> <li>odwołania do zmiennych, <li>wbudowane polecenia interpretera, <li>pętle sterujące, <li>wywołania programów i innych skryptów, <li>komentarze. </ul> Wszystkie linie rozpoczynających się od znaku <b>#</b>, traktowane są przez powłokę jako komentarz i w związku z tym są ignorowane. <p> <h5><b>(4.1) Argumenty wywołania</b></h5> </p> <p>Argumenty wywołania skryptu przekazywane są do powłoki jako parametry pozycyjne. Parametr <b>$0</b> zawsze wskazuje nazwę skryptu, zaś parametry <b>$1, $2, ...</b> przechowują kolejne argumenty. Nazwa skryptu nie podlega przesunięciu w wyniku działania polecenia <b>shift</b>.</p> <h5><b>(4.2) Metody uruchamiania skryptów</b></h5> <p>Skrypt zawiera listę poleceń, które powinień wykonać interpreter. Istnieje kilka sposobów uruchomienia skryptu.</p> <p>Naturalnym sposobem jest jawne wywołanie nowego interpretera z pierwszym argumentem w postaci nazwy skryptu:</p> <h6>sh skrypt arg ...</h6> <h6>bash skrypt arg ...</h6> <p>Wygodniej jest jednak posługiwać się wyłącznie nazwą skryptu jako nazwą nowego polecenia. W tym celu należy wcześniej ustawić prawo wykonywania skryptu:</p> <h6>chmod +x skrypt</h6> <h6>skrypt arg ...</h6> <p>Powstaje problem wyboru interpretera, który wykona skrypt. A wybór ten nie jest dowolny, gdyż każda powłoka stosuje inną składnię. Domyślnie uruchamiana jest powłoka sh. Użytkownik może wskazać dowolny interpreter umieszczając jego pełną nazwę ścieżkową w pierwszej linii skryptu po znakach <b>#!</b>,<b> </b><em class="przyklad"><b>np.: #!/bin/bash</b>.</em></p> <p>W obydwu powyższych przypadkach uruchamiany jest nowy proces interpretera, który wykonuje polecenia zawarte w skrypcie, po czym kończy swoje działanie. Sterowanie wraca do procesu interpretera, w którym wydano polecenie. Nie są w nim widoczne zmiany dokonane w skrypcie takie, jak modyfikacja zmiennych czy zmiana bieżącego katalogu.</p> <p>Skrypt może być również wykonany przez bieżący interpreter i wtedy wszystkie zmiany pozostają widoczne po zakończeniu skryptu. Służy do tego polecenie <b>.</b> (w powłokach sh i bash)) lub <b>source</b> (w powłoce bash):</p> <h6> . skrypt arg ...</h6> <h6>source skrypt arg ... </h6> <p>Typowym zastosowaniem tej metody jest ponowne odczytanie plików konfiguracyjnych powłoki po wprowadzeniu modyfikacji, np:</p> <p><em class="przyklad"><b>.</b> .bashrc</em></p> <p><em class="przyklad">source .cshrc</em><br> </p> <p>Skrypt można wreszcie uruchomić zamiast bieżącego interpretera, posługując się poleceniem <b>exec</b>: </p> <h6>exec skrypt arg ... </h6> <p>W tym przypadku proces interpretera, który ma wykonać skrypt, zastępuje bieżący interpreter. Po zakończeniu działania skryptu nie istnieje już proces, w którym wydano polecenie. Sterowanie przechodzi więc do procesu nadrzędnego (macierzystego) lub następuje wylogowanie z systemu.</p> <p></p> <center><h4>Programowanie w języku powłoki</h4></center> <h5><b>(5.1) Pętle i polecenia sterujące</b></h5> <p>Zestaw złożonych poleceń powłoki <b>bash</b> obejmuje większość typowych pętli i poleceń sterujących.</p> <p>Pętla <b>for</b> wykonuje się raz dla każdego słowa z listy. Jeśli lista zostanie pominięta, pętla wykonuje się raz dla każdego ustawionego parametru pozycyjnego.</p> <p><tt>&lt;font color=&quot;#0000cd&quot;&gt;&lt;b&gt;for&lt;/b&gt; zmienna [&lt;b&gt;in&lt;/b&gt; słowo ...]&lt;br&gt; &lt;b&gt;do &lt;/b&gt;lista_poleceń&lt;br&gt; &lt;b&gt;done&lt;/b&gt;&lt;/font&gt;</tt></p> <p>Pętla <b>for</b> może przyjąć również drugą postać, w której:</p> <ul> <li>wyrażenie1 określa warunek początkowy i obliczane jest tylko raz przed pierwszą iteracją pętli, <li>wyrażenie2 pełni rolę warunku zakończenia pętli i obliczane jest na początku każdej iteracji dopóki nie osiągnie wartość zerowej, <li>wyrażenie3 obliczane jest w każdej iteracji pętli po wykonaniu listy poleceń. </ul> <p><font color="blue"><br> </font><font color="#0000cd"><tt>&lt;b&gt;for&lt;/b&gt;</tt><tt> ((wyrażenie1; wyrażenie2; wyrażenie3))</tt><tt>&lt;br&gt; </tt><tt>&lt;b&gt;do&lt;/b&gt;</tt><tt> lista_poleceń</tt><tt>&lt;br&gt; </tt><tt>&lt;b&gt;done&lt;/b&gt;</tt></font></p> <p>Pętla <b>while</b> wykonywana jest dopóki ostatnie polecenie z listy warunków zwraca status <u>zerowy</u>.</p> <p><tt>&lt;font color=&quot;#0000cd&quot;&gt;&lt;b&gt;while&lt;/b&gt; lista_warunków&lt;br&gt; &lt;b&gt;do&lt;/b&gt; lista_poleceń&lt;br&gt; &lt;b&gt;done&lt;/b&gt;&lt;/font&gt;</tt></p> <p>Pętla <b>until</b> wykonywana jest dopóki ostatnie polecenie z listy warunków zwraca status <u>niezerowy</u>.</p> <p><tt>&lt;font color=&quot;#0000cd&quot;&gt;&lt;b&gt;until&lt;/b&gt; lista_warunków&lt;br&gt; &lt;b&gt;do&lt;/b&gt; lista_poleceń&lt;br&gt; &lt;b&gt;done&lt;/b&gt;&lt;/font&gt;</tt></p> <p>Polecenie <b>case</b> stara się dopasować słowo kolejno do każdego wzorca i wykonuje listę poleceń związaną z pierwszym pasującym wzorcem.</p> <p><tt>&lt;font color=&quot;#0000cd&quot;&gt;&lt;b&gt;case&lt;/b&gt; słowo &lt;b&gt;in&lt;/b&gt;&lt;br&gt; wzorzec [|wzorzec] ...) lista_poleceń;;&lt;br&gt; ...&lt;br&gt; &lt;b&gt;esac&lt;/b&gt;&lt;/font&gt;</tt></p> <p>W poleceniu <b>if</b> wykonywana jest gałąź, dla której ostatnie polecenie z listy warunków zwraca status zerowy.</p> <p><tt>&lt;font color=&quot;#0000cd&quot;&gt;&lt;b&gt;if&lt;/b&gt; lista_warunków&lt;br&gt; &lt;b&gt;then&lt;/b&gt; lista_poleceń&lt;br&gt; [&lt;b&gt;elif&lt;/b&gt; lista_warunków&lt;br&gt; &lt;b&gt;then&lt;/b&gt; lista_poleceń]&lt;br&gt; ...&lt;br&gt; [&lt;b&gt;else&lt;/b&gt; lista_poleceń]&lt;br&gt; &lt;b&gt;fi&lt;/b&gt;&lt;/font&gt;</tt></p> <p>Pętle <b>for</b>, <b>while</b> i <b>until</b> mogą być przerywane za pomocą poleceń: <b>break [n]</b> i <b>continue [n]</b> Polecenie <b>break</b> przerywa wykonywanie pętli. Polecenie <b>continue</b> przerywa wykonywanie bieżącej iteracji pętli i wznawia następną iterację. Obydwa polecenia przerywają <b>n</b> poziomów zagnieżdżonych pętli, gdy podany jest argument. Domyślnie przyjmowane jest <b>n</b>=1.</p> <p>Zakończenie działania powłoki umożliwia polecenie: <b>exit [status] </b>Argument oznacza status zakończenia zwracany przez powłokę. Domyślnie zwracany jest status zerowy.</p> <p> <h5><b>(5.2) Sprawdzanie warunków</b></h5> </p> <p>Polecenia sterujące<b> if</b>, <b>while</b> i <b>until</b> wykorzystują jako warunek działania status zakończenia innego polecenia. Może to być dowolne polecenie systemu Linux. Najczęściej najbardziej praktyczne okazuje się klasyczne sprawdzenie jakiegoś warunku np. porównanie dwóch liczb lub ciągów znaków. Takich możliwości dostarcza wbudowany w powłokę mechanizm sprawdzania warunków:</p> <h6><tt>&lt;font color=&quot;#0000cd&quot;&gt;[[ warunek ]]&lt;/font&gt;</tt></h6> oraz polecenie <b>test</b>, które można wywołać na dwa sposoby; <h6><tt>&lt;font color=&quot;#0000cd&quot;&gt;test warunek&lt;/font&gt;</tt></h6> <h6><tt>&lt;font color=&quot;#0000cd&quot;&gt;[ warunek ]&lt;/font&gt;</tt></h6> We wszystkich przypadkach składnia specyfikowania warunku jest podobna. Istnieje możliwość sprawdzania atrybutów plików, porównywania ciągów znaków i liczb całkowitych. Liczby rzeczywiste traktowane są jak ciągi znaków. <p>Testowanie atrybutów pliku wygląda następująco:</p> <table border="0" cellspacing="5" cellpadding="1"> <tr> <td><b><tt>-r plik</tt></b></td> <td>-</td> <td>sprawdza, czy użytkownik posiada prawo do czytania,</td> </tr> <tr> <td><b><tt>-w plik</tt></b></td> <td>-</td> <td>sprawdza, czy użytkownik posiada prawo do pisania,</td> </tr> <tr> <td><b><tt>-x plik</tt></b></td> <td>-</td> <td>sprawdza, czy użytkownik posiada prawo do wykonywania,</td> </tr> <tr> <td><b><tt>-f plik</tt></b></td> <td>-</td> <td>sprawdza, czy <b><tt>plik </tt></b>to plik zwykły,</td> </tr> <tr> <td><b><tt>-d plik</tt></b></td> <td>-</td> <td>sprawdza, czy <b><tt>plik </tt></b>to katalog,</td> </tr> <tr> <td><b><tt>-c plik</tt></b></td> <td>-</td> <td>sprawdza, czy <b><tt>plik </tt></b>to plik specjalny znakowy,</td> </tr> <tr> <td><b><tt>-b plik</tt></b></td> <td>-</td> <td>sprawdza, czy <b><tt>plik </tt></b>to plik specjalny blokowy,</td> </tr> <tr> <td><b><tt>-p plik</tt></b></td> <td>-</td> <td>sprawdza, czy <b><tt>plik </tt></b>to plik FIFO,</td> </tr> <tr> <td><b><tt>-s plik</tt></b></td> <td>-</td> <td>sprawdza, czy <b><tt>plik </tt></b>to plik o niezerowej długości.</td> </tr> </table> <p><br> <br> <em class="przyklad"><b><u>Przykład<br> </u></b></em><em class="przyklad">Sprawdzanie, czy użytkownik posiada prawo pisania w katalogu dir. </em></p> <p><em class="kod">if [ -w dir ]<br> then<br> mkdir nowy_katalog<br> fi</em></p> <p><br> Testowanie ciągów znaków wygląda następująco:</p> <table border="0" cellspacing="5" cellpadding="1"> <tr> <td><b><tt>s1</tt></b></td> <td>-</td> <td>sprawdza, czy ciąg jest niezerowy,</td> </tr> <tr> <td><b><tt>s1 = s2</tt></b></td> <td>-</td> <td>sprawdza, czy ciągi są identyczne,</td> </tr> <tr> <td><b><tt>s1 != s2</tt></b></td> <td>-</td> <td>sprawdza, czy ciągi są różne.</td> </tr> </table> <p><br> <br> <em class="przyklad"><b><u>Przykład<br> </u></b></em><em class="przyklad">Sprawdzanie, czy bieżącym katalogiem jest katalog domowy użytkownika.</em></p> <p><em class="kod">if [ $pwd=$HOME ]<br> then<br> mkdir nowy_katalog<br> fi</em></p> <p><br> Porównywanie liczb całkowitych umożliwiają operatory:</p> <table border="0" cellspacing="5" cellpadding="1"> <tr> <td><b><tt>n1 -eq n2</tt></b></td> <td>-</td> <td>sprawdza czy <b>n1 = n2</b>,</td> </tr> <tr> <td><b><tt>n1 -ne n2</tt></b></td> <td>-</td> <td>sprawdza czy <b>n1 &gt;&lt; n2</b>,</td> </tr> <tr> <td><b><tt>n1 -gt n2</tt></b></td> <td>-</td> <td>sprawdza czy <b>n1 &gt; n2</b>,</td> </tr> <tr> <td><b><tt>n1 -ge n2</tt></b></td> <td>-</td> <td>sprawdza czy<b> n1 &gt;= n2</b>,</td> </tr> <tr> <td><b><tt>n1 -lt n2</tt></b></td> <td>-</td> <td>sprawdza czy <b>n1 &lt; n2</b>,</td> </tr> <tr> <td><b><tt>n1 -le n2</tt></b></td> <td>-</td> <td>sprawdza czy <b>n1 &lt;= n2.</b></td> </tr> </table> <p><em class="przyklad"><b><u>Przykład<br> </u></b></em><em class="przyklad">Wypisywanie kolejno argumentów wywołania skryptu.</em></p> <p><em class="kod">while [ $# -gt 0 ]<br> do<br> echo $1<br> </em><em class="kod">shift<br> done</em></p> <p>Warunki można ze sobą łączyć korzystając z następujących operatorów logicznych:</p> <table border="0" cellspacing="5" cellpadding="1"> <tr> <td><b>-a</b></td> <td>-</td> <td>operator AND,</td> </tr> <tr> <td><b>-o</b></td> <td>-</td> <td>operator OR,</td> </tr> <tr> <td><b>( )</b></td> <td>-</td> <td>grupowanie warunków.</td> </tr> </table> <p></p> <h5><b>(5.3) Operacje arytmetyczne</b></h5> <p>Niektóre interpretery, jak <b>sh</b> i <b>csh</b>, nie mają wbudowanych żadnych operacji arytmetycznych. Powłoka <b>bash</b> udostępnia możliwość rozwijania wyrażeń arytmetycznych bezpośrednio w poleceniach:</p> <h6>$((wyrażenie))</h6> oraz poprzez wbudowane polecenie <b>let:</b> <h6>let wyrażenie [wyrażenie ...]</h6> Każdy argument polecenia <b>let</b> traktowany jest jako oddzielne wyrażenie, które należy niezależnie obliczyć. Wyrażenie może zawierać jedynie argumenty całkowite i operatory. Zestaw dostępnych operatorów oraz priorytety poprzedzania są identyczne jak w języku C. Poniżej przedstawiamy wybrane operatory, zaś pełną listę można znaleźć w dokumentacji elektronicznej lub w literaturze. <p>Wybrane operatory przedstawiono w tablicy 4.5:</p> <div align="center"> <table border="2" cellpadding="2" cellspacing="2" bgcolor="#fffff0"> <caption><font size="+1"><b>Tablica 4.5</b> Operatory polecenia let</font></caption> <tr> <td> <div align="center"> <b><font size="+1">Kategoria operatorów</font></b></div> </td> <td> <div align="center"> <b><font size="+1">Operatory</font></b></div> </td> </tr> <tr> <td>arytmetyczne</td> <td><b>++, --, **, *, / , %, -, +</b></td> </tr> <tr> <td>logiczne</td> <td><b>!, &amp;&amp;, ||</b></td> </tr> <tr> <td>bitowe</td> <td><b>~, &lt;&lt;, &gt;&gt;, &amp;, ^, |</b></td> </tr> <tr> <td>podstawienia</td> <td><b>=, *=, /=, %=, +=, -=, &lt;&lt;=, &gt;&gt;=, &amp;=, ^=, |=</b></td> </tr> <tr> <td>porównania</td> <td><b>&lt;=, &gt;=, &lt;, &gt;, ==, !=</b></td> </tr> </table> </div> <p><em class="przyklad"><b><u>Przykład<br> </u></b></em><em class="przyklad">Obliczenia z wykorzystaniem poleceń powłoki <b>bash</b>.</em></p> <p><em class="przyklad"><br> [[email protected]]$ let x=5*6<br> [[email protected]]$ echo $x<br> 30<br> [[email protected]]$ echo $((x=7*8))<br> 56<br> [[email protected]]$ echo $x<br> 56</em></p> <p>Do przeprowadzenia operacji obliczeniowych można również wykorzystać program <b>expr</b> uruchamiany w następujący sposób:</p> <h6><tt>expr arg1 operator arg2 ...</tt></h6> Program oblicza wartość podanego wyrażenia i wysyła do <b>stdout</b>. Podstawienia można dokonać niezależnie w powłoce: <h6>zmienna=expr wyrażenie</h6> <div align="left"> Wszystkie argumenty i operatory w wyrażeniu muszą być rozdzielone znakami spacji. Operatory można podzielić na trzy grupy (tablica 4.6):</div> <div align="center"> <table border cols="2" cellpadding="2" cellspacing="2" bgcolor="#fffff0"> <caption><font size="+1"><b>Tablica 4.6</b> Operatory polecenia expr</font></caption> <tr> <td> <div align="center"> <b><font size="+1">Kategoria operatorów</font></b></div> </td> <td> <div align="center"> <b><font size="+1">Operatory</font></b></div> </td> </tr> <tr> <td>arytmetyczne</td> <td><b>+, -, \*, /, %</b></td> </tr> <tr> <td>porównania</td> <td><b>=, !=, \&gt;, \&gt;=, \&lt;, \&lt;=</b></td> </tr> <tr> <td>dopasowania</td> <td><b>:</b></td> </tr> </table> </div> <p>Niektóre operatory (np. *) są znakami specjalnymi i mogą zostać przedwcześnie zinterpretowane przez powłokę zamiast przez program <b>expr</b>. W związku z tym powinny być poprzedzone znakiem <b>\</b>, aby przekazać je bezpiecznie do programu <b>expr</b>. Operatory arytmetyczne działają na liczbach całkowitych. Operatory porównania zapewniają porównanie arytmetyczne liczb całkowitych lub porównanie leksykalne innych argumentów. Operator <b>:</b> umożliwia sprawdzenie ile znaków z podanego ciągu pasuje do wzorca:</p> <h6><tt>string : wzorzec</tt></h6> Wzorzec może zawierać znaki specjalne. Zestaw dostępnych znaków specjalne jest taki jak dla programu <b>grep</b>. <p><em class="przyklad"><b><u>Przykład<br> </u></b></em><em class="przyklad">Wykorzystanie polecenia <b>expr</b> do wykonywania obliczeń.</em><em class="kod"><br> x=expr $x + 1
    </em></p>

    <em class="przyklad">Wykorzystanie operatora : polecenia expr.
    </em><em class="kod"> expr $1 : '.*'
    expr $1 : '[0-9]*'</em>

    (5.4) Operacje wejścia/wyjścia
    </p>

    Powłoka bash umożliwia wczytywanie danych ze strumienia wejściowego i wypisywanie komunikatów do strumienia wyjściowego.

    read [opcje] [zmienna ...]
    Polecenie read odczytuje jedną linię ze strumienia wejściowego stdin. Następnie dokonuje podziału na wyrazy, stosując separatory zdefiniowane w zmiennej IFS i przypisuje kolejne wyrazy zmiennym podanym na liście argumentów.
    echo [opcje] [arg ...]
    Polecenie echo przesyła na standardowe wyjście stdout argumenty rozdzielone znakiem spacji. Argumentem może być dowolny ciąg znaków, zawierający również znaki specjalne powłoki, np. odwołania do zmiennych.
    printf format [arg ...]
    Polecenie printf wypisuje argumenty na standardowym wyjściu zgodnie z podanym formatem. Sposób formatowania jest identyczny jak w przypadku funkcji printf() języka C.

    (5.5) Funkcje
    </p>

    Interpreter umożliwia definiowanie własnych funkcji:

    [function] nazwa () {lista_poleceń;}

    Odwołanie do funkcji następuje przez nazwę, podobnie jak do wszystkich poleceń. Funkcje są zawsze wykonywane przez bieżącą powłokę. Argumenty wywołania funkcji zostają ustawione jako parametry pozycyjne powłoki wyłącznie na okres wykonywania funkcji.

    <em class="przyklad">Przykład
    Zdefiniowana poniżej funkcja wyświetla informacje o poprawnym wywołaniu skryptu
    </em>

    <em class="kod">usage()
    {
    echo &quot;Poprawne wywolanie to : nazwa_skryptu arg1 op1 arg2 ... &quot;
    echo &quot;\nWywolania,operatory i realizowane dzialania &quot;
    echo &quot;Dodawanie np: 2 + 3 &quot;
    echo &quot;Odejmowanie np: 4 - 5 &quot;
    echo &quot;Dzielenie np: 4 / 2 &quot;
    echo &quot;Mnozenie np: 4 * 4 &quot;
    echo &quot;Potegowanie np: 4 \^ 4&quot;
    exit
    }
    </em>

3 komentarze

Brak avatara
nickelback 2013-11-08 13:05

;'.;

lofix 2003-08-02 12:54

artykuł jest ok, fajnie że ktoś zebrał wszystkie rzeczy , które mozna znalezc w necie do jednej kupy ...

my_nick 2003-08-02 14:20

Kawał dobrej roboty, mi się na pewno przyda.