JĘZYK SHELL JEST PEŁNYM JĘZYKIEM PROGRAMOWANIA, który zawiera: zmienne, konstrukcje warunkowe i iteracyjne (IF-THEN-ELSE, CASE, DO WHILE, DO UNTIL), konfigurowane środowisko użytkownika. METAZNAKI zestaw znaków specjalnych, za pomocą których można zastępować zwykłe znaki w nazwach plików i katalogów: krótsze pisanie, stosowanie konwencji nazw, uproszczenie programowania w języku Shell. Założenie /home/iksinski/dydaktyka/apl/w-1 W-2 W-3... W-19 W-1-old W-2-old Metaznak opis * dopasuj dowolny łańcuch znaków (również pusty) ls /home/iksinski/dydaktyka/apl/w-*? dopasuj pojedynczy znak alfanumeryczny ls /home/iksinski/dydaktyka/apl/w-? ls /home/iksinski/dydaktyka/apl/w-1? [...] dopasuj pojedynczy znak lub zestaw znaków z nawiasów [abcdefg] albo [a-g] ls /home/iksinski/dydaktyka/apl/w-[1-9] ls /home/iksinski/dydaktyka/apl/w-[1-9]* ls /home/iksinski/dydaktyka/apl/w-[1-46-9] ls /home/iksinski/dydaktyka/apl/w-[!5] KSH?(lista_wzorców) dopasuj dowolny wzorzec z listy; lista to zestaw jednego lub więcej wzorców rozdzielonych znakiem 1
ls W-?(1 2 7)!(lista_wzorców) dopasuj dowolny znak oprócz znaków zawartych we wzorcach listy ls W-!(1 2 7) +(lista_wzorców) dopasuj jeden lub więcej wzorców z listy (wzorzec musi wystąpić w nazwie przynajmniej raz) ls W-1+(back)* odp.: No such file or directory *(lista_wzorców) dopasuj zero lub więcej wzorców z listy ls W-1*(back)* odp.: W-1, W-10, W-11, W-12, W-13 @(lista_wzorców) dopasuj tylko jeden wzorzec z listy KSH/Bash ~ zastąp znak katalogiem osobistym ~- zastąp znaki poprzednim katalogiem roboczym ~+ zastąp znaki bieżącym katalogiem roboczym ~UID zastąp znaki katalogiem domowym użytkownika o podanej nazwie rozwijanie nawiasów (), {} ls ~/*/*{.doc,.txt} mkdir ~/(roki,rokii,rokiii,rokiv,rokv) 2
INNE ZNAKI SPECJALNE znak znaczenie ; separator poleceń & wykonaj w tle potok poleceń ( ) grupuj polecenia < przeadresuj wejście polecenia > przeadresuj wyjście polecenia ${zmienna} podstaw wartość zmiennej shella `polecenie` podstaw wynik polecenia (ze standardowego wyjścia) \ zacytuj znak w celu zasłonięcia znaczenia specjalnego ls \*test napis cytuj wszystkie znaki w napisie napis cytuj wszystkie znaki, ale wykonaj podstawienia ${zmn}$1 # komentarz {pol1;pol2} wykonaj polecenia w bieżącym shellu 3
WYRAŻENIA REGULARNE wyrażenia wzorcowe ułatwiające wyszukiwanie i filtrowanie informacji w plikach. Stosowane m.in. w poleceniach: grep, pg, awk Operator Opis i przykłady dowolny ciąg Proste wyrażenie regularne, w którym ciąg znaków oznacza sam siebie znaków np. iksinski oznacza słowo (wzorzec) iksinski. Dopasuj dowolny pojedynczy znak (? w metaznakach) np.:..z.. wszystkie wyrazy 5-literowe, z wielkim Z w środku $ Dopasuj poprzedzające operator wyrażenie regularne do końca wiersza np.: KONIEC$ - słowo KONIEC na końcu wiersza ^ Dopasuj występujące po operatorze wyrażenie regularne do początku wiersza np.: ^start - słowo start na początku wiersza * Dopasuj zero lub więcej wystąpień poprzedzającego operator wyrażenia (działanie * inne niż w metaznakach) np.: ro*k odpowiada zarówno wzrocowi rk, jak i roook roo*k odpowiada wzorcowi rok i rooooook \ Użyte przed dowolnym operatorem wyrażeń regularnych oznacza pominięcie specjalnego znaczenia tego znaku; znak \ przed dowolny innym znakiem oznacza sam siebie [ ] Dopasuj dowolny znak z zestawu między nawiasami np.: [a-z] wszystkie małe litery [A-Z] wszystkie wielkie litery [a-za-z] wszystkie litery [0-9] wszystkie cyfry [^ ] Dopasuj dowolny znak, który nie znajduje się w nawiasach np.: [^0-9] oznacza wszystkie znaki, które nie są cyframi \\ Puste wyrażenie regularne, które przyjmuje wartość ostatniego wyrażenia regularnego \ (wyr_reg\) Zapamiętaj wyrażenie regularne w ( ) do dalszego wykorzystania; każdy zapamiętany wzorzec otrzymuje numer kolejny od 1 do 9 licząc od lewej np.: \(.*\):\(.*\):\1:\2 zapamiętaj dowolny ciąg znaków z pierwszego 4
\ {m,n\} \ {m\} \ {m, \} pola (pola pooddzielane :), zapamiętaj dowolny ciąg znaków z drugiego pola i porównaj odpowiednio: pierwsze pole z trzecim, drugie z czwartym Konstrukcja nadzoruje liczbę dopasowań poprzedzającego wyrażenia regularnego, gdzie m minimum, n maksimum. Jeżeli wyrażenie wystąpi co najmniej m razy i co najwyżej n razy, wtedy zakłada się, że wystąpiło dopasowanie. np.: [+-]\{0,1\}[0-9] znak + lub może wystąpić najwyżej raz przed dowolną cyfrą albo wcale Jeżeli występuje tylko m (\ {m\}), to wyrażenie musi być dopasowane dokładnie m razy. np.: [+-]\{1\}[0-9] znak + lub musi wystąpić raz przed dowolną cyfrą Jeżeli n jest pominięte (\ {m, \}), to wyrażenie musi być dopasowane co najmniej m razy. np.: [+-]\{1,\}[0-9] znak + lub musi wystąpić raz lub więcej przed dowolna cyfrą ZADANIA: 1. Podać wyrażenie regularne (wzorzec): a) dowolnego napisu, b) dowolnej liczby całkowitej, c) dowolnej liczby całkowitej poprzedzonej znakiem + lub d) dowolnego ciągu znaków (litery, cyfry, znaki różne ), e) wiersza zawierającego same spacje, f) dowolnej liczby całkowitej bądź rzeczywistej. 5
PRZEADRESOWYWANIE WEJŚCIA-WYJŚCIA pozwala: tworzyć pliki, dołączać dane do plików, korzystać z istniejących plików jako wejścia dla innych poleceń, łączyć dwa strumienie wejściowe, korzystać z części skryptu shellowego jako wejścia. UNIX programowanie w shellu (1) Operator Funkcja < Przekieruj standardowe wejście > Przekieruj standardowe wyjście >> Dołącz standardowe wyjście do pliku <<ogr Przekaż na standardowe wejście dane od tego miejsca do ogranicznika ogr <& Użyj deskryptora 2 na wejściu zawsze wtedy, kiedy używany jest deskryptor 1 >& Połącz deskryptor 1 z deskryptorem 2 >>& Dołącz deskryptor 1 do deskryptora 2 Przekaż w potoku standardowe wyjście na standardowe wejście &- Zamknięcie otwartego pliku np.: exec 4>&- # zamknięcie pliku o deskryptorze 4 Deskryptor pliku liczba, dzięki której system UNIX identyfikuje pliki otwarte do przetwarzania. W jednym momencie można otworzyć 20 plików o deskryptorach z zakresu 0-19. 0 wejście (ang. stdin) 1 wyjście podstawowe (ang. stdout) 2 wyjście diagnostyczne (ang. stderr) 3-19 pliki wejścia-wyjścia określone przez użytkownika ZADANIA 1. Podać polecenie zamknięcia standardowego wyjścia. 6
ZMIENNE SHELLA służą do przechowywania danych, które mają być wykorzystywane w procedurach shella. Zmienna jest obszarem pamięci, do którego ma się dostęp za pomocą nazwy tworzonej w momencie przypisywania wartości zmiennej. Do wartości zmiennej odwołujemy się poprzez znak $. Rodzaje zmiennych shella: specjalne, środowiska shella, np. PATH, HOME, LOGNAME, programowe tworzone przez użytkownika. Zmienne specjalne shella Zmienna Funkcja $# Liczba argumentów pozycyjnych (parametrów wywołania) $0 Nazwa skryptu $1, $2,... Argumenty pozycyjne (parametry wywołania) przekazane do shella (skryptu) $* Rozwijane do $1 $2... $@ Rozwijane do $1 $2... $- Opcje shella z polecenia set $? Kod powrotu ostatniego polecenia $$ Numer procesu bieżącego shella $! Numer procesu ostatniego zadania wsadowego Wartości zmiennym można przypisywać bezpośrednio lub za pomocą podstawienia wyników innego polecenia shella, np.: MIESIAC=12 MIESIAC=`date + %m ` 7
KONSTRUKCJE SEKWENCYJNE Symbol Znaczenie ; Ogranicznik polecenia np.: pol1; pol2; pol3 ( ) Grupowanie poleceń do wykonania w podshellu np.: (pol1; pol2 pol3) pol4 { } Grupowanie poleceń do wykonania w bieżącym shellu ` ` && np.: { pol1; pol2 pol3;} pol4 UNIX programowanie w shellu (1) - nawias otwierający { musi być oddzielony spacją, a zamykający } poprzedzony średnikiem Podstawianie poleceń Sprawdzenie kodu powrotu, wykonanie polecenia w przypadku prawdy np.: pol1 && pol2 - wykonaj pol2, jeśli pol1 zakończyło się powodzeniem Sprawdzenie kodu powrotu, wykonanie polecenia w przypadku fałszu np.: pol1 pol2 powodzeniem - wykonaj pol2, jeśli pol1 nie zakończyło się ZADANIA 1. Porównaj następujące polecenia: pol1 { pol2; pol3;} pol1 pol2; pol3 8