unix – skrypty powłoki
-
Upload
nguyennhan -
Category
Documents
-
view
234 -
download
1
Transcript of unix – skrypty powłoki
UNIX – POWŁOKA I POTOK
WYKŁAD 6
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]
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
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
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
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
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
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
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:
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
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.
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
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
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
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
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 !!!
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
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
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.
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
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. )
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)
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
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
UNIX – POWŁOKA, REDYREKCJA, POTOK
KONIEC