|
|
pl:dydaktyka:unix:lab_skrypty [2013/09/16 16:26] kkluza [Język Sh] |
pl:dydaktyka:unix:lab_skrypty [2019/06/27 15:50] |
====== Filtry i Skrypty powłoki Sh ====== | |
<code> | |
W związku z narastającą liczbą osób, które zwą informatykę | |
"czarną magią" przedstawiam listę różnic między | |
informatykiem a czarnoksiężnikiem: | |
| |
Czarnoksiężnik krzyczy "hokus-pokus" i "abra-kadabra". | |
Informatyk: "bash" "grep" czy "sed" | |
| |
Czarnoksiężnik odeśle cię do diabła. | |
Informatyk wyśle cię do /dev/null | |
| |
Czarnoksiężnik przenosi przedmioty wzrokiem. | |
Informatyk obsługuje komputer bez myszki. | |
| |
Czarnoksiężnicy porozumiewają się telepatycznie. | |
Informatycy używają komunikatorów. | |
| |
W domu czarnoksiężnika są tajemna komnaty. | |
W komputerze informatyka są ukryte foldery. | |
| |
Aby coś było niewidzialne, czarnoksiężnik używa różdżki. | |
Informatyk dodaje tylko kropkę przed nazwą. | |
| |
Ogólnie nasi czytelnicy oskarżali się na fakt, że obie grupy społeczne | |
używają niezrozumiałych słów (zaklęć, poleceń), noszą dziwne ubrania | |
(szaty, koszulki z napisami), otaczają się nietypowymi przedmiotami | |
(różdżki w parasolach, pen-drive'y w pluszakach) a co najważniejsze - | |
posiadają dziwną i niepojętą dla zwykłego śmiertelnika wiedzę tajemną, | |
pozwalającą im rozwiązywać problemy (o których zasadniczo nikt nie | |
wie) w sposób, którego nikt nie rozumie. | |
| |
/* nadesłał: Grzegorz Mucha, IS 2012 */ | |
</code> | |
| |
| |
===== DO PRZYGOTOWANIA ===== | |
Samodzielnie należy przed tym laboratorium przygotować: | |
| |
* podstawy pracy z wybranym edytorem vi, Emacs, nano, pico | |
* przeczytać artykuł pt.: {{:pl:dydaktyka:unix:gjn-sh.pdf|Podstawy programowania skryptów Sh}} | |
* przeczytać artykuł pt.: {{:pl:dydaktyka:unix:gjn-bash.pdf|GNU Bash więcej niż Sh | |
}} | |
Dodatkowo przeglądnąć: | |
| |
* zapoznać się z //[[http://www.tldp.org/guides.html#abs|Advanced Bash-Scripting Guide]]// | |
* przeglądnąć kurs //[[http://learnlinux.tsf.org.za/courses/build/shell-scripting|Shell Scripting]]// | |
* przegląnąć artykuł (3 części) //Bash by example// [[http://www-128.ibm.com/developerworks/linux/library/l-bash.html|część 1]], [[http://www-128.ibm.com/developerworks/linux/library/l-bash2.html|Część 2]], [[http://www-128.ibm.com/developerworks/library/l-bash3.html|Część 3]] | |
* ew. przeglądnąć [[http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html|BASH Programming - Introduction]] | |
| |
| |
===== WPROWADZENIE ===== | |
| |
| |
==== Rola skryptów w administrowaniu ==== | |
| |
* pozwalają na łatwe zautomatyzowanie często wykonywanych zadań, | |
* upraszczają administrowanie systemem, | |
* umożliwiają dostosowanie narzędzi administracyjnych do swoich celów, | |
* jak również stworzenie swoich własnych narzędzi. | |
| |
| |
==== Czym są skrypty ==== | |
| |
* skrypty są plikami zawierającymi programy w języku skryptowym. | |
* ten język jest najczęściej interpretowany, | |
* w pewnym stopniu spowalnia to jego pracę, | |
* ale ułatwia pisanie i uruchamianie. | |
* dostarcza wielu narzędzi "wysokopoziomowych" | |
| |
==== Języki i narzędzia do pisania skryptów ==== | |
Istnieje wiele różnorodnych języków i narzędzi do pisania skryptów. Najpopularniejsze to: | |
| |
* Sh, | |
* Csh/Ksh, | |
* AWK, | |
* Perl, | |
* Tcl, | |
* Python. | |
| |
==== Skrypty powłoki Sh ==== | |
Skrypt sh jest to: | |
| |
* plik tekstowy zawierający dowolne polecenia wykonywalne oraz wyrażenia języka sh, | |
* nawet prosta sekwencja poleceń, normalnie wydawanych w powłoce sh, zapisana w pliku staje się skryptem. | |
| |
| |
==== Uruchamianie pliku skryptu ==== | |
| |
* Aby skrypt można było wykonywać bezpośrednio poprzez podanie nazwy, należy nadać mu atrybut wykonywalności (+x). | |
* Wykonywalny plik tekstowy zawierający polecenia jest uruchamiany najczęściej przy pomocy powłoki logowania użytkownika. | |
* Aby mieć pewność, że skrypt zostanie uruchomiony przy pomocy odpowiedniego interpretera, trzeba to w nim zapisać. | |
* Pierwsza linia skryptu powinna mieć postać: | |
| |
#!/pelnasciezka/interpreter opcje | |
| |
* Co w przypadku skryptów sh wygląda tak: | |
| |
#!/bin/sh | |
| |
* Od znaku hash (#) zaczyna się komentarze, sekwencja ''#!'' na początku pliku jest traktowana jako podanie interpretera. | |
| |
| |
==== Przydatne narzędzia ==== | |
| |
Pisząc skyrpty korzysta się z dowolnych poleceń Unixa. | |
Tym niemniej największą rolę odgrywają zestawy podstawowych narzędzi GNU. | |
| |
Proszę przeczytać manual do: | |
* //textutils// | |
* //fileutils// | |
* //sh-utils// | |
| |
Dodatkowo przydatne narzędzia to: | |
* **find** | |
* **xargs** | |
* **sed** | |
* **awk** | |
| |
==== Podstawianie wyników pracy poleceń ==== | |
Podstawianie wyników poleceń w linii poleceń jest realizowane przez odwrotny apostrof (klawisz tyldy, nad tabulatorem), na przykład: | |
| |
<cli> | |
$ echo "To jest system" `uname` "na maszynie "`hostname` | |
</cli> | |
| |
==== Find ==== | |
Program służy do wyszukiwania plików w systemie plików. | |
Podstawowe użycie to: | |
| |
find sciezka -name nazwapliku -print | |
| |
Pozwala na zadawanie wielu kryteriów wyszukiwania, łączonych operatorami boolowskimi. | |
| |
==== Język Sh ==== | |
| |
* Zmienne - podstawy | |
* Dowolne polecenia dostępne w systemie | |
* Zmienne i polecenia zewnętrzne - odwrócony apostrof, | |
* Instrukcje warunkowe: **if**, **test** i **case**, | |
* Funkcje | |
* Parsing opcji z linii poleceń (przykład parser.sh) | |
* Inne... | |
| |
Szczegóły w artykule {{:pl:dydaktyka:unix:gjn-sh.pdf|Podstawy programowania skryptów Sh}} | |
| |
===== ĆWICZENIA ===== | |
| |
==== - Przydatne narzędzia ==== | |
=== find === | |
Znaleźć przy pomocy find: | |
| |
* w katalogu ///usr/bin// wszystkie pliki o nazwie zaczynającej się na ''au'', | |
* w katalogu ///tmp// wszystkie pliki należące do użytkownika ''root'', | |
* w katalogu ///tmp// wszystkie pliki modyfikowane w ciągu ostatnich 24 godzin, | |
| |
=== Podstawianie wyników pracy poleceń === | |
Przy pomocy odwróconego apostrofu (obok Tabulatora!) napisać polecenie przypisujące do zmiennej WYNIK: | |
| |
* aktualną datę, | |
* napis o treści System pracuje od A, jest zalogowanych B uzytkownikow, gdzie za A i B mają być wstawione odpowiednie informacje z polecenia **uptime** | |
| |
Przykład: | |
| |
WYNIK="To jest system `uname` na maszynie `hostname`"; echo $WYNIK | |
To jest system Linux na maszynie deathstar | |
| |
==== - Zaawansowane filtry ==== | |
| |
Napisać filtr, który: | |
| |
* wyświetli 7 pierwszych, posortowanych alfabetycznie, nazw plików o nazwie kończącej się na p znajdujących się w katalogu ///usr/bin//. | |
* poda liczbę wszystkich plików zawierających w nazwie słowo ''debian'', znajdujących sie w katalogu ///usr/bin//. | |
* zapisze do pliku spis posortowaną alfabetycznie listę użytkowników aktualnie zalogowanych z komputerów mających w nazwie domeny napis ''.ia.agh.edu.pl'' | |
* wybierze z 6 ostatnich linii pliku spis te, które zawierają słowo cos i poda ilość występujących w nich znaków. (plik testowy należy stworzyć) | |
==== - Proste skrypty ==== | |
=== Edytory === | |
Oglądnąć jak przebiega edycja w edytorze mcedit i GNU Emacs (w razie potrzeby włączyć: ''M-x sh-mode'' i ''M-x font-lock-mode'') | |
| |
=== Tworzenie skryptów === | |
Napisać poprawny skrypt, który wyświetli: | |
| |
* aktualną datę, nazwę i czas pracy systemu, | |
* spis zalogowanych użytkowników i spis sesji osoby uruchamiającej skrypt, | |
* wyświetli prawa dostępu do pliku podanego jako parametr z linii poleceń: ''skrypt plik'' i poda typ/opis tego pliku | |
* do powyższego skryptu dopisać (najlepiej w postaci funkcji) kod sprawdzający czy właściciel pliku jest zalogowany, a jeżeli tak to wyświetli informacje o nim i jego otwarte sesje. | |
* napisać skrypt (np. do użycia jako CGI) generujący dynamicznie stronę WWW (plik HTML) o tytule: ''To jest spis plikow w katalogu KATALOG'' zawierającą spis i opis plików w podanym z lini poleceń katalogu, na każda pozycja spisu jest hiperpołączniem do odpowiedniego pliku. | |
| |
| |
==== - Złożone skrypty ==== | |
Przeanalizować działanie skryptów podanych na [[http://home.agh.edu.pl/gjn/dydaktyka/index2008.html#skrypty|starej stronie]] | |
===== Jeśli chcesz wiedzieć więcej ===== | |
* Napisz skrypt, który dla każdego z plików podanych jako argumenty wywołania wyświetli w kolejnych liniach 3 najczęściej powtarzające się w nim słowa. | |
* Napisz skrypt, który dla każdego z plików podanych jako argumenty sprawdzi (np. za pomocą polecenia ''file'') zastosowany na nim typ kompresji, a następnie zastosuje odpowiedni program do rozpakowania go. Jeżeli plik wejściowy nie jest spakowany, skrypt powinien wyswietlić ostrzeżenie i nie podejmować żadnej akcji względem tego pliku. | |
* Napisz skrypt, który zarchiwizuje wszystkie pliki z Twojego katalogu domowego zmodyfikowane w przeciągu ostatnich 24 godzin (można użyć polecenia ''find''). | |
* Napisz skrypt, który wyświetli po jednym wszystkie pliki z katalogu domowego większe niż 100kB. Dla każdego wyświetlonego pliku skrypt ma zapytać, czy uzytkownik chce skompresować czy usunąć plik, postapić zgodnie z jego wyborem, i przejść do nastepnego pliku. Skrypt ma zapisać do pliku nazwy i czas usunięcia usuniętych plików. | |
* Napisz skrypt "bezpiecznego usuwania" ''srm.sh'', który podane jako argumenty pliki skompresuje (o ile już nie są skompresowane - należy to sprawdzić, np. przy pomocy polecenia ''file'') a następnie przeniesie je do folderu ''/home/user/trash''. Przy wywołaniu skrypt powinien sprawdzić folder ''trash'' i usunąć z niego pliku starsze niż 48 godzin. | |
* Napisz skrypt, który rozwiązuje równanie kwadratowe (przyjmując jako argumenty parametry równania), użyj polecenia ''bc''. | |
* Lista mailingowa. Napisz skrypt, uzywając polecenia ''mail'', który zarządza prostą listą mailingową. Skrypt ma za zadanie co miesiąc odczytywać treść zadanego pliku (podanego jako 1.argument) i rozsyłać go adresatom umieszczonym na liście w pliku podanym jako 2. argument. | |
| |
* Więcej ciekawych zadań: [[http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/writingscripts.html|tu]] | |
* //[[http://www.gnu.org/software/sed/|Sed]]//: seria artykułów na [[http://www.ibm.com/developerworks|dW]]: [[http://www.ibm.com/developerworks/linux/library/l-sed1.html|część 1]], [[http://www.ibm.com/developerworks/linux/library/l-sed2.html|część 2]], [[http://www.ibm.com/developerworks/linux/library/l-sed3.html|część 3]], | |
* //[[http://www.gnu.org/software/awk/|Awk]]//: seria artykułów na [[http://www.ibm.com/developerworks|dW]]: [[http://www.ibm.com/developerworks/linux/library/l-awk1.html|część 1]], [[http://www.ibm.com/developerworks/linux/library/l-awk2.html|część 2]], [[http://www.ibm.com/developerworks/linux/library/l-awk3.html|część 3]], | |
* Cykl przykładów narzędzi: [[http://www.ibm.com/developerworks/linux/library/l-tiptex1.html|Tip 1]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex2.html|Tip 2]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex3.html|Tip 3]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex4.html|Tip 4]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex5.html|Tip 5]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex6.html|Tip 6]] | |