unix – skrypty powłoki

25
UNIX POWŁOKA I POTOK WYKŁAD 6 Skrypty powłoki

Transcript of unix – skrypty powłoki

Page 1: unix – skrypty powłoki

UNIX – POWŁOKA I POTOK

WYKŁAD 6

Skrypty powłoki

Page 2: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

POWŁOKA ( ang. SHELL) – tak jak większość elementów w systemie UNIX, również powłoka jest programem, takim jak np. polecenia ls, rm, mkdir itp.

jeśli powłoka to program, to wynika z tego iż nową powłokę Bourne’ możemy uruchomić w następujący sposób lub sh ponieważ ścieżka dostępu do programu sh jest przypisana do zmiennej PATH, w której system standardowo poszukuje wybranego polecenia (zmienną PATH możemy edytować)

$/bin/sh

standardowe strumienie wejścia/wyjścia dla powłoki

STDERR - standardowe urządzenie dla komunikatów ( default=monitor )‏

STDIN - standardowe urządzenie wejścia ( default = klawiatura )‏

STDOUT - standardowe urządzenie wyjścia ( default = monitor )‏

Powłoka uruchomiona bez parametrów i bez redyrekcji strumienia STDIN, pracuje w trybie interakcyjnym tzn. po wykonaniu ostatniego polecenia przechodzi na nasłuch ( z klawiatury ) następnego polecenia pokazując prompt na ekranie ($)‏

zestaw parametrów wywołania powłoki poleceniem

$ sh parametr1 parametr2 [... parametrN]

Page 3: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

jeśli powłoka zostanie uruchomiona w jeden z dwojga poniżej przytoczonych metod: sh <plik1, sh plik1 to źródłem poleceń dla nowo uruchomionej powłoki , jest informacja zapisana w pliku o nazwie plik1.

Użytkownik chce szybko się dowiedzieć, ile obiektów znajduje się we wskazanym katalogu ( w przykładzie jest to katalog /home ).

Przykład

Zapiszmy możliwe rozwiązania do dwóch plików, odpowiednio: wykonaj1.sh, wykonaj2.sh.

Wykonaj 1 Wykonaj 2

ls -l /home >listahome

wc -l <listahome

rm listahome

1

2

3

ls -l /listahome | wc -l 1

Uruchomienie skryptu Uruchomienie skryptu

$ sh wykonaj1 $ sh wykonaj2

Page 4: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Rozwiązanie zaproponowane poprzednio jest mało elastyczne. Zawsze będzie zliczać pliki w katalogu /home. Zliczenie plików w innym katalogu będzie możliwe gdy zmienimy tekst /home na inny ( prawidłowo skonstruowaną ścieżkę do katalogu) w plikach: wykonaj1 lub wykonaj2.

aby rozwiązać ten problem posłużymy się tzw. parametrami pozycyjnymi reprezentowanymi w sposób symboliczny za pomocą:

$1 , $2 , $3 , $4 , $5 ,

$6 , $7 , $8 , $9

W trakcie realizacji nowego procesu powłoki w miejsce parametru pozycyjnego wstawiany jest parametr z linii wywołania nowej powłoki.

Zmieniamy zawartość pliku wykonaj1 tak , by w miejsce /home wstawić $1

Przykład

Wykonujemy polecenie:

Wykonujemy polecenie

$ shwykonaj1 /home/studenci

$ shwykonaj1/home

Page 5: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Pokażemy zastosowanie dwóch parametrów pozycyjnych. Dodamy:

Przykład

informację o ilości plików w danym katalogu

dane autora skryptu

Zmieniamy zawartość pliku wykonaj1

Uruchamiamy nową powłokę

Wykonaj1 – nazwa pliku - $0 /home/studenci– $1

Janusz Donizak– $2

Page 6: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Jeszcze większą elastyczność zastosowania powłoki jako programu daje możliwość uczynienie utworzonego pliku plikiem wykonywalnym (egzekucyjnym

Przykład

1. Sprawdzamy prawa dostępu do pliku wykonaj1

2. Modyfikujemy prawa dostępu (w odniesieniu do siebie jako właściciela pliku)

3. Sprawdzamy ponownie nowe prawa dostępu do pliku wykonaj1

4. Uruchamiamy program ( nowe polecenie !!! ) ./wykonaj parametr1 paramter2

Znaki ./ na początku polecenia wskazują jednoznacznie ścieżkę do katalogu aktualnego. Aby się go pozbyć należałoby skopiować tak przygotowany program do jednego z

katalogów zapisanych w zmiennej PATH

Page 7: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

ZMIENNE POWŁOKI – W powłoce można używać zmiennych, którym przypisuje się określoną wartość za pomocą instrukcji przypisania (podstawienia)‏

nazwazmiennej=wartość

jeżeli pod zmienną chcemy przypisać dwu lub kilku członowy ciąg znaków (tekst) to należy go ująć w znaki cudzysłowia (“tekst”)

pomiędzy nazwą zmiennej, znakiem równości i wartością nie umieszcza się żadnych odstępów.

nazwazmiennej – powinna rozpoczynać się od litery bądź znaku podkreślenia (_)

X=2, WYRAZ=Ala, KATALOG=/home, CIAG=”Hello World”

aby odwołać się do wartości zmiennej, wewnątrz skryptu, należy jej nazwę poprzedzić znakiem $

Aby dokładnie określić początek i koniec nazwy zmiennej, stosujemy nawiasy klamrowe {} aby zwolnić zmienną stosujemy zapis: unset ZMIENNA

Przykład

$wartoscciag ${wartosc}ciag ZMIENNA = wartoscciag ZMIENNA =wartosc

Page 8: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zmienne powłoki ustalane w momencie uruchomienia nowego procesu powłoki . # - ilość parametrów pozycyjnych wywołania procedury powłoki,

? - kod powrotu (dziesiętnie) ostatniego procesu uruchomionego synchr.

$ - numer procesu (PID) właśnie tej procedury powłoki ! - numer procesu (PID) ostatniego polecenia wykonanego w tle (background)‏

* - wszystkie parametry pozycyjne razem

HOME - ścieżka do katalogu osobistego właściciela procesu procedury powłoki PATH - ścieżki przeszukiwane w celu odszukania plików poleceń,

Przykład Zmienne w skrypcie

Uruchomienie skryptu

Odwołanie do zmiennych w pliku

echo $abc $1 $kon

Page 9: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Sprawdźmy jakie wartości przyjmują zmienne powłoki dla przykładowego skryptu

Przykład

chcemy sprawdzić zmienne: #, $, *

Spróbujmy uruchomić program z różną ilością parametrów pozycyjnych:

Page 10: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Podstawienie polecenia pod zmienną Często zdarza się, że pod zmienną w krypcie chcemy podstawić wynik działania pewnego polecenia. Aby to zrobić należy zastosować następującą składnię.

stosując powyższą składnię mamy pewność iż po wykonaniu polecenia A, jego wynik zostanie zapisany w zmiennej, a nie wyświetlony na STDOUT

ZMIENNA=`wynik_poleceniaA`

UWAGA: zastosowany znak cytowania, to klawisz : (pod ESC) ` ~

Przykład Napiszmy skrypt, który przypisze zmiennej ile1 ilość podkatalogów, w katalogu wskazanym parametrem pozycyjnym

$ ./za1.sh /home

Uruchamiamy

Page 11: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

INSTRUKCJA CASE – instrukcję wyboru case, stosujemy wówczas, gdy rozpatrywana zmienna może przyjąć jedną z kilku możliwych wartości. W zależności od wyniku działania pewnego polecenia lub arbitralnie obranego warunku, wykorzystując instrukcję case możemy zadecydować w Jaki sposób dalej zadziała napisany przez nas skrypt

Składnia

case $zmienna in 1) ciąg poleceń 1

2) ciąg poleceń 2

*) domyślny ciąg poleceń

;;

;;

;;

esac

zmienna w instrukcji case poprzedzona jest znakiem $ ponieważ odwołujemy się do wartości przez nią przechowywanej !!

każda opcja (tutaj 1, 2, itd.) zakończona jest dwoma średnikami

ilość możliwych do wyboru opcji jest dowolna i zależy tylko i wyłącznie od autora skryptu

aby zabezpieczyć się przed podaniem przez użytkowani skryptu nieprzewidzianej przez nas wartości zmiennej, wprowadzamy opcję *) która wykona domyślny ciąg poleceń jeśli żadna z wybranych opcji nie będzie odpowiadać wprowadzonej wartości zmiennej.

Page 12: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Przykład

W przykładzie wykorzystamy instrukcję wyboru case do analizy ilości parametrów wywołania procedury. Do rozwiązania zadania zastosujemy również uprzednio poznane parametry pozycyjne ($1, $2,… ) i jedną z predefiniowanych zmiennych powłoki ($#).

Komentarz ! W skryptach powłoki poprzedzany

znakiem #

0 parametrów 0)

1 parametr 1)

2 parametry 2)

Wszelkie pozostałe możliwości *)

case - początek

case - koniec

Page 13: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 1

Zaprogramuj skrypt powłoki, który będzie przeszukiwał określony przez użytkownika katalog w poszukiwaniu plików o żądanej nazwie. Program zapisz w ten sposób, aby:

$1 – określał katalog, w którym przeprowadzane będzie wyszukiwanie

$2 – określał nazwę pliku, który ma zostać odnaleziony.

Ad. 1 Zadanie rozpocznij od skonturowania potoku, który pozwoli przeszukać dowolny katalog w poszukiwaniu pliku określonej nazwie.

Ad. 1 Wykorzystaj instrukcję case, aby zapobiec uruchomieniu procedury z niewłaściwą ilością parametrów pozycyjnych

Page 14: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

INSTRUKCJA WARUNKOWA IF – stosowana wtedy, gdy w programie dochodzimy do miejsca, w którym musimy dokonać wyboru dalszej drogi działania na podstawie wyniku określonego przez nas warunku. Np. sprawdzamy, czy plik ma prawa do uruchamiania, czy katalog jest pusty , rozstrzygamy, w którym katalogu jest więcej plików itd..

Składnia

If warunek then

else

fi

grupa poleceń 1

grupa poleceń 2

Zagnieżdzenie elif = else if

If warunekA then

If warunekB then

grupa poleceń 1 else

grupa poleceń 2 fi

fi

If warunekA then

grupa poleceń 1 elif warunekB

then grupa poleceń 2

fi fi

grupa poleceń 1 – wykonywana wtedy, gdy warunek jest spełniony, tzn. jeśli kod wyjścia polecenia warunek = 0

grupa poleceń 2 – wykonywana wtedy, gdy warunek nie jest spełniony, tzn. jeśli kod wyjścia polecenia warunek > 0

Page 15: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

w skryptach powłoki, do sprawdzenia określonego warunku bardzo często łącznie z instrukcją if wykorzystuje się polecenie test lub równoznaczny: [ warunek ]

Przykłady instrukcji warunkowej if

If ( test $zmienna 1 -gt $zmienna 2 ) -ge

-lt

-le

-eq

If test –f $zmienna 1 –d

–w

–r

–x

– sprawdza czy zmienna1 > zmiennej2

– sprawdza czy zmienna1 >= zmiennej2

– sprawdza czy zmienna1 < zmiennej2

– sprawdza czy zmienna1 <= zmiennej2

– sprawdza czy zmienna1 = zmiennej2

– sprawdza czy zmienna1 istnieje i jest plikiem zwykłym

If ( test $zm 1 -gt $zm 2 -a $zm1 –eq $zm3 )

– sprawdza czy zmienna1 istnieje i jest katalogiem

– sprawdza czy zmienna1 jest plikiem z prawem do odczytu

– sprawdza czy zmienna1 jest plikiem z prawem do zapisu

– sprawdza czy zmienna1 jest plikiem z prawem do uruchamiania

– i jednocześnie czy zm1 = zm3

sprawdza czy zm1 > zm2 -o – lub czy zm1 = zm3

Page 16: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Ćwiczenie

Poniższy program ma za zadanie sprawdzić jaka powłoka jest obecnie zainstalowana w systemie. Przepisz poniższy kod, a następnie (po upewnieniu się, że działa) zamień polecenie sh odpowiednio na: ksh, bash, csh, zsh, ash.

/dev/null – katalog pusty, tzw. ”studnia bez dna” , przekierowując do niego STDOUT polecenia sh –c exit,, zapobiegamy wyświetleniu się niepożądanego komunikatu na ekran monitora. 2 – STDEER !!! – z tym bardzo ostrożnie. Stosować redyrekcję tylko w ostateczności !!!

Page 17: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 3

Zaprogramuj skrypt powłoki, który będzie przeszukiwał określony przez użytkownika katalog w poszukiwaniu plików o żądanej nazwie. Proszę rozbudować przedni program w taki sposób, aby mógł on „poradzić” sobie w sytuacji, gdy nie znajdzie odpowiedniego pliku.

Ad. 1 Proszę przyjrzeć się informacji na wyjściu z potoku w momencie, gdy jakikolwiek plik zostanie znaleziony i porównać ja z sytuacją której pliku nie uda się odnaleźć

Rozwiązanie

Page 18: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 4

Zaprogramuj skrypt powłoki, sprawdzi, w którym spośród dwóch katalogów jest więcej plików. W zadaniu, ścieżki do porównywanych katalogów proszę podać za pomocą parametrów pozycyjnych.

Ad. 1 W pierwszej kolejności należy utworzyć potok, który zliczy ilość plików w danym katalogu

Ad. 2 Następnie, działający potok należy zapisać do odpowiednich zmiennych., zliczając w ten sposób ilość plików w pierwszym i drugim katalogu. UWAGA: Podczas przypisywania potoku do zmiennej pamiętamy iż należy go ująć w znaki ` `.

Ad. 3 Na koniec, korzystając z instrukcji warunkowej if należy porównać obydwie zmienne i w zależności od wyniku porównania wypisać na ekran stosowny komunikat

Ad. 4 Program można ewentualnie rozbudować, wprowadzając instrukcję case, aby zabezpieczyć się przed uruchomieniem go z niewłaściwą ilością parametrów pozycyjnych

Rozwiązanie Krok po Kroku

Page 19: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

PĘTLA FOR – jest konstrukcją programistyczną pozwalającą na wielokrotne powtórzenie jednego lub wielu poleceń. Jest ona niezwykle przydatna podczas :

– grupą plików, – Wielokrotnego wykonywania tych samych operacji (nawiązywanie połączeniasieciowego)

– Wykonywania operacji na pewnej liczbie elementów

Składnia

for zmienna in lista do grupa poleceń done

Składnia – Tylko powłoka Bash !

for ((i=1; i<=10; i++))‏ do grupa poleceń done

– elementy stałe pętli for

– elementy zmienne, zależne od użytkownika

grupa poleceń wykonywana jest tylokrotnie, ile obiektów występuje w liście lista, przy czym za każdym razem zmienna przyjmuje kolejną wartość z listy lista. możliwe jest wielokrotne zagnieżdżanie pętli wewnątrz pętli, przy czym należy zachować indywidualną (unikalną) nazwę zmiennej dla każdej z nich.

Page 20: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Szczególne konstrukcje pętli for

for zmienna in $* – zmienna w pętli przyjmuje kolejne wartości parametrów pozycyjnych wpisanych przy uruchamianiu procedury for zmienna in * – gdy lista ma postać reprezentowaną przez pojedynczy znak *, wtedy lista reprezentuje zbiór nazw obiektów (plików i podkatalogów) w katalogu aktualnym.

Przykład

Page 21: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 5

parametr procedury poprzedzony znakiem - , potraktuje jako opcję, wyświetlając stosowny komunikat, typu „To jest opcja, nie mogę kontynuować”.

Napisz skrypt powłoki, który:

sprawdzi które parametry pozycyjne z linii wywołania procedury są plikami zwykłymi, a które katalogami

Ad. 1 Na początku, napiszmy skrypt, który sprawdzi, czy wprowadzony jako parametr pozycyjny plik, jest plikiem zwykłym, czy też może katalogiem (Pomoc: man test)

Ad. 2 Następnie wprowadźmy pętlę for w jednej z jej szczególnych konstrukcji, w taki sposób, aby dla dowolnej ilości wprowadzonych parametrów pozycyjnych wykonany został test z Ad. 1

Rozwiązanie Krok po Kroku

Ad. 3 Na koniec wprowadźmy instrukcję wyboru case w taki sposób, aby uwzględnić możliwość pojawienia się opcji w miejscu parametru pozycyjnego (Podpowiedź: każda opcja zawsze poprzedzona jest znakiem „ - ” np. –l , --help itd. )

Page 22: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 6

Bazując, na rozwiązaniu poprzedniego zadania napisz program, który wykorzystując pętle for skopiuje, z wybranego przez użytkowa katalogu, pliki o rozszerzeniach .odt, .ods, .jpg w taki sposób aby:

pliki.odt – znalazły się w utworzonych przez użytkownika katalogu: Dokumenty

pliki.ods – znalazły się w utworzonych przez użytkownika katalogu: Arkusze

pliki.ods – znalazły się w utworzonych przez użytkownika katalogu: Obrazy

Rozwiązanie Krok po Kroku

Ad. 1 Na początku należy zastosować pętle for w sposób odpowiedni do pracy z plikami (patrz. Szczególne konstrukcje pętli for)

Ad. 2 Wprowadzając instrukcję case będziemy mogli dokonać wyboru spośród trzech dostępnych opcji (tutaj rozszerzenia plików)

Ad. 3 Aby program w pełni spełniał swoje zadanie należałoby jeszcze sprawdzić, czy plik który chcemy skopiować posiada prawa do odczytu? W tym celu wykorzystujemy instrukcję warunkową if, konstrukcyjnie zbliżoną do instrukcji if z poprzedniego zadania

UWAGA: Proszę również uwzględnić fakt iż plik nie będzie mógł być skopiowany gdy nie będziemy posiadali, ku temu odpowiednich praw (tuta praw do odczytu)

Page 23: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 7

Utwórz w katalogu aktualnym:

Trzy pliki tekstowe (z rozszerzeniem .txt) o dowolnej zawartości

listę plików w postaci (1.cal, 2.cal … 12.cal) z których każdy zawierał będzie kalendarz na koleiny miesiąc 2011 roku. W tym celu sprytnym będzie posłużenie się pętla for przy tworzeniu plików

Napisz procedurę, która po uruchomieniu

wyszuka pliki zwykłe o rozszerzeniu .txt oraz .cal, a następnie

dla plików o rozszerzeniu .txt otworzy edytor tekstu: Polecenie treści: /usr/bin/gedit nazwapliku uruchamia edytor dla pliku nazwapliku

plikom o rozszerzeniu .cal zmieni rozszerzenie na .st (wykorzystaj polecenie mv)

Uwaga: najpierw trzeba sprawdzić, czy użytkownik uruchamiający procedurę ma uprawnienia zapisu

Page 24: unix – skrypty powłoki

UNIX – SKRYPTY POWŁOKI

Zadanie 8

Przygotuj procedurę, która utworzy kopie zapasowe wszystkich plików z katalogu domowego użytkownik i umieści je w katalogu BACKUP (utworzonym przez użytkownika)‏

W zadaniu należy wykorzystać pętlę for w celu skopiowania wszystkich plików z katalogu domowego, do katalogu BACKUP (oczywiście przed kopiowaniem każdego pliku należy sprawdzić czy mamy prawo do jego odczytu)

Jeśli w katalogu BACKUP nie ma jeszcze pliku, który aktualnie ma zostać w nim zapisany, to zwyczajnie go kopiujemy

Jeśli w katalogu BACKUP jest już plik, który zamierzamy skopiować, to należy sprawdzić czy pliki są takie same (możemy to zrobić sprawdzając ich rozmiar). Jeśli będą się różnic to należy nadpisać stary plik nowym.

UWAGA: Głowna trudność powyższego zadania polega na opracowaniu algorytmu, który pozwoli skutecznie odróżnić od siebie plik będący już w katalogu BACKUP od pliku, który ma go nadpisać.

Opis rozwiązania

Page 25: unix – skrypty powłoki

UNIX – POWŁOKA, REDYREKCJA, POTOK

KONIEC