Kurs BASHa
-- Sebastian Pawlak
+-----------------------------------------------+ |Tworzenie skryptow bash`owych w UNIX`ie (v1.2)| | - - - - - - - - - - - - - - - - - - - - - - - | | Sebastian Pawlak | | s1222@qmail.pjwstk.waw.pl | | http://mh4000.pjwstk.waw.pl/~s1222 | +-----------------------------------------------+ Zmiany w stosunku do poprzedniej wersji: - kilka poprawek oraz rozszerzony opis praw dostepu do katalogow i plikow, dodany opis polecen powodujacych wylogowania ; rozbudowany opis polecenia 'test' (2000-10-20). Zestawienie odpowiadajacych sobie polecen systemu DOS i UNIX: +-------------------------+-------------------------+-----------------------+ | Polecenie | DOS | UNIX | +-------------------------+-------------------------+-----------------------+ | separator skladnikow | \ (backslash) | / (slash) | | sciezki dostepu | | | | | | | | wyswietlenie zawartosci | dir | ls | | aktualnego katalogu | | | | | | | | kopiowanie plikow i | copy | cp | | katalogow | | | | | | | | zmiana nazwy plikow i | rename | mv | | katalogow | | | | | | | | tworzenie katalogow | mkdir | mkdir | | | | | | tworzenie plikow | copy con | cat > plik | | | | | | kasowanie plikow | del | rm | | | | | | kasowanie katalogow | erase | rmdir, rm -r | | | | | | zmiana pozycji w | cd | cd | | strukturze katalogow | | | +-------------------------+-------------------------+-----------------------+ - wylogowanie z systemu po skonczonej pracy: aby wylogowac sie (opuscic system) mozna uzyc polecen: logout lub exit lub kill -1 0 - "zabija shell`a" - powoduje wylogowanie, mozliwe jest rowniez wylogowanie poprzez uzycie kombinacji klawiszy: ctrl+d - zmiana hasla aktualnie zalogowanego uzytkownika: passwd lub innego uzytkownika (dostepne tylko dla root`a): passwd username - poruszanie sie po drzewie podkatalogow: przejscie do katalogu glownego: cd / przejscie do katalogu domowego zalogowanego uzytkownika: cd ~ lub cd przejscie do katalogu innego uzytkownika: cd ~username przejscie do katalogu identyfikowanego przez wzorzec: cd katal* - gdy wystepuje kilka katalogow pasujacych do wzorca to zostanie wybrany pierwszy w kolejnosci alfabetycznej. sciezka wzgledna: cd ../etc - przejscie do katalogu nadrzednego, a nastepnie do katalogu "etc", cd ../../ - przejscie o dwa poziomy wyzej, cd ../.. - przejscie o dwa poziomy wyzej (to samo), cd etc/uucp - przejscie z aktualnego katalogu do podrzednego "etc" a nastepnie do "uucp". sciezka bezwzgledna: cd /etc - przejscie do katalogu "etc" z katalogu glownego, cd /../etc - przejscie do katalogu "etc" z katalogu glownego (przejscie do ".." nie jest mozliwe do wykonania, bo nie mozna wyjsc wyzej niz do glownego katalogu "/", i jest ignorowane), cd /etc/../mnt - przejscie do katalogu "etc" (z katalogu glownego), nastepnie ponowne wyjscie do katalogu glownego i wejscie do katalogu "mnt" (z kat. glownego). - wyswietlanie zawartosci aktualnego katalogu: proste wypisanie listy plikow i katalogow: ls core mail mbox nsmail programy wypisanie kompletnej listy plikow i katalogow: ls -a . .. .ee .mc .netscape core mail mbox nsmail programy wypisanie szczegolowej listy plikow i katalogow: ls -l total 5299 -rw------- 1 root root 5398528 Oct 9 23:46 core drwx------ 2 root root 1024 Oct 15 1999 mail -rw------- 1 root root 1717 Oct 15 1999 mbox drwx------ 2 root root 1024 Oct 9 23:40 nsmail drwxr-xr-x 3 root root 1024 Oct 15 1999 programy uzycie ls -al daje wypisanie kompletnej i szczegolowej listy wypisanie rekurencyjne (od aktualnego podkatalogu w glab drzewa): ls -R .: core mail mbox nsmail programy mail: saved-messages sent-mail nsmail: programy: password ls programy/password: - tworzenie katalogow: mkdir dirname - tworzy katalog "dirname" w aktualnym katalogu, mkdir ../dirname - tworzy katalog w katalogu nadrzednym, mkdir /mnt/dirname - tworzy katalog "dirname" w katalogu "/mnt". - usuwanie pustych katalogow: rmdir katalog - usuwanie rekurencyjne katalogow i plikow: usuniecie poddrzewa (bez zapytan potwierdzajacych) realizuje sie przez: rm -fr katalog parametr 'f' (force) w praktyce oznacza kasowanie bez zapytań oraz kasowanie katalogów, parametr 'r' (recursive) oznacza usuwanie drzewa katalogów. - usuwanie plikow: rm plik - kasuje plik (wyswietla zapytanie o potwierdzenie), rm -f plik - (-f force) kasuje plik (nie wymaga potwierdzenia). - przenoszenie (zmienianie nazwy) plikow: mv zrodlo cel - skladnia polecenia polecenie "mv" sluzy do przenoszenia katalogow lub plikow do innych katalogow lub tez do zmiany nazwy katalogow / plikow; przeniesienie pliku "plik" z aktualnego katalogu do podkatalogu "programy": mv plik programy przeniesienie katalogu "kat" z katalogu "/root" do katalogu "/root/programy": mv /root/kat /root/programy przeniesienie ze zmiana nazwy pliku "plik" do katalogu "programy" (nie moze istniec katalog "plik2"; w przeciwnym razie nastapi zwyczajne przeniesienie "plik" do wnetrza katalogu "programy/plik2"): mv plik programy/plik2 zmiana nazwy pliku (katalogu) mv plik nowyplik przyklad: mv /root/plik.text /root/ala_ma_kota - jesli w katalogu "/root" istnieje katalog o nazwie "ala_ma_kota" to wtedy plik (katalog) o nazwie "plik.text" zostanie przeniesiony do katalogu "/root/ala_ma_kota". W przeciwnym przypadku, jesli w katalogu "/root" nie istnieje katalog "ala_ma_kota", to wtedy plik (katalog) "plik.text" zostanie ulokowany w katalogu "/root" i ulegnie zmianie jego nazwa na nowa "ala_ma_kota". - kopiowanie: cp zrodlo cel - skladnia polecenia skopiowanie pliku "ala" do pliku "ola" (plik "ola" bedzie stworzony automatycznie): cp ala ola - uzyskujemy sklonowanie pliku "ala" w plik "ola", skopiowanie grupy plikow: cp *.* kat - zostana skopiowane wszystkie pliki, ktore maja w swojej nazwie umowny znak rozszerzenia "." (np. ala.txt), do katalogu "kat" (w systemach UNIX`owych nie istnieje pojecie rozszerzenia pliku), cp *.*.* kat - zostana skopiowane pliki, ktore maja dwa znaki "." w swojej nazwie, cp * kat - z aktualnego katalogu zostana skopiowane do katalogu "kat" wszystkie pliki, cp *a* kat - zostana skopiowane pliki, ktore maja znak "a" w swojej nazwie, cp ?la kat - zostana skopiowane pliki o dowolnym pierwszym znaku i koncowce "la" (np. ala bla ola) - znak "?" dziala podobnie jak "*" ale odnosi sie tylko do jednego znaku, cp a[l,c]b kat - zostana skopiowane pliki o pierwszej literze "a", ostatniej literze "b" oraz literze "l" lub "c" w srodku (moga to byc pliki: "alb" i "acb"). - wyswietla aktualny katalog, w ktorym sie znajdujemy: pwd - informacje o zalogowanych uzytkownikach: who lub w lub last | grep still - chat: write username - pisanie do uzytkownika (zakonczyc przez ctrl+d), mesg [y/n] - odblokowanie / zablokowanie mozliwosci pisania (odbierania) wiadomosci. - polecenie "ps" (wypisuje aktualnie uruchomione procesy): ps PID TTY TIME CMD 879 pts/2 00:00:00 bash 880 pts/2 00:00:00 ps ps -f UID PID PPID C STIME TTY TIME CMD root 879 877 0 17:02 pts/2 00:00:00 bash root 881 879 0 17:04 pts/2 00:00:00 ps -f ps -f - wypisuje liste procesow zorientowana na uzytkownika, ps -aux - wypisuje szczegolowa liste procesow (lacznie z procesami innych uzytkownikow). gdzie: PID - numer procesu, UID - nazwa uzytkownika, wlasciciela procesu. - zabijanie procesow: kill 122 - usuwa proces o numerze 122 (pole PID w liscie procesow), kill -9 122 - usuwa oporny proces :-), kill -1 0 - zabija shell`a - powoduje wylogowanie. - pomoc na temat polecenia: aby uzyskac informacje na temat dostepnych polecen lub ich parametrow nalezy uruchomic program "man"; man polecenie klawisze: / - pozwala na wprowadzenie wzorca do wyszukania (w dol) w tekscie, gdy wzorzec byl juz wprowadzony to wcisniecie entera powoduje przejscie do kolejnego pasujacego do wzorca napisu, ? - pozwala na wprowadzenie wzorca do wyszukania (do gory) w tekscie, gdy wzorzec byl juz wprowadzony to wcisniecie entera powoduje przejscie do poprzedniego pasujacego do wzorca napisu, n / N - przejscie do nastepnego / poprzedniego lub poprzedniego / nastepnego pasujacego do wzorca napisu (dzialanie zalezy od tego czy poprzednio uzyty byl znak "/" czy "?"), q - wyjscie do shella. - operacje na strumieniach oraz mechanizm pipes: program > plik - to co wypisze program bedzie w pliku "plik" program >> plik - to co wypisze program bedzie dopisane do pliku "plik" program1 | program 2 - to co wypisuje "program1" zostaje przekierowane do strumienia wejsciowego programu "program2", program 2>/dev/null - wypisywane przez program, na standardowe wyjscie dla bledow, napisy sa przekierowywane do urzadzenia null (nie sa wyswietlane na ekranie). - znaki specjalne: ctrl + d - koniec pliku (uzycie w shell`u powoduje wylogowanie), ctrl + j - dziala jak klawisz Enter, @ - czasami odpowiada "null", ? - "a?a" moze byc interpretowane jak: ala, aga, aua, ..., * - "a*a" : ala, alfa, aga, auto, aula, awangarda, [] - "a[l,x]a" : ala, axa. - polecenie "cat" (wypisuje to co przeczyta): cat - wypisuje na ekran to co zostanie wprowadzone (z klawiatury), cat plik - wypisuje na ekran zawartosci pliku "plik", cat plik1 plik2 - wypisuje na ekran zawartosc obydwu plikow, cat plik > wyjscie - wypisuje zawartosc pliku "plik" do strumienia skojarzonego z plikiem "wyjscie", cat p1 p2 > p3 - do pliku "p3" zostanie zapisana suma plikow "p1" i "p2", cat plik1 >> plik2 - dopisuje "plik1" do "plik2", cat plik1 >> plik1 - rekurencja, w tym przypadku, nie jest mozliwa. - polecenie "more" (ekran po ekranie, wiersz po wierszu): more plik - wyswietla zawartosc pliku "plik" czekajac na nacisniecie klawisza po kazdym ekranie / wierszu (enter - przesuwa o wiersz, spacja - przesuwa o ekran), cat plik | more - to samo co wyzej (zawartosc pliku "plik" zostanie przeslana za pomoca pipe do programu "more"), ls -la | more - wyswietla kompletna i szczegolowa liste plikow i katalogow czekajac na klawisz po kazdym ekranie (stosowac nalezy gdy lista zbiorow nie miesci sie na ekranie). klawisze: spacja - przewiniecie o ekran, enter - przewiniecie o wiersz, q - wyjscie do shell`a. - polecenie "less" (swobodne przewijanie w gore i w dol): less plik - wyswietla zawartosc pliku czekajac na klawisz, ls -la | less - wyswietla kompletna i szczegolowa liste plikow i katalogow czekajac na klawisz, wcisniecie klawiszy: / - pozwala na wprowadzenie wzorca do wyszukania (w dol) w tekscie, gdy wzorzec byl juz wprowadzony to wcisniecie entera powoduje przejscie do kolejnego pasujacego do wzorca napisu, ? - pozwala na wprowadzenie wzorca do wyszukania (do gory) w tekscie, gdy wzorzec byl juz wprowadzony to wcisniecie entera powoduje przejscie do poprzedniego pasujacego do wzorca napisu, n / N - przejscie do nastepnego / poprzedniego lub poprzedniego / nastepnego pasujacego do wzorca napisu (dzialanie zalezy od tego czy poprzednio uzyty byl znak "/" czy "?"), q - wyjscie do shella, strzalki - przesuwanie w gore i w dol tekstu. jak widac polecenie "less" jest lepsze (pozwala na przegladanie pliku w gore i w dol) niz polecenie "more" - choc ich nazwy sugeruja, ze sytuacja powinna byc odwrotna. Latwo zapamietac roznice miedzy nimi uczac sie krotkiego powiedzonka: "less jest lepsze niz more" - ot taki shell`owy dowcip :) - polecenie "grep" (szuka napisow pasujacych do wzorca): cat plik | grep napis - wypisze te linie pliku "plik", w ktorych wystapil "napis", grep napis plik - podobnie jak wyzej, grep -rl napis /usr/doc - przeszukuje drzewo w glad (od /usr/doc) i wypisuje nazwy plikow, w ktorych wystapil wzorzec "napis", ls -la | grep ^d - wypisuje te linie, ktore maja znak "d" na poczatku (czyli katalogi). ls -la | grep ^-r - wypisuje liste plikow z prawami czytania przez uzytkownika, ls -la | grep ^[d,-]r - wypisuje liste plikow i katalogow z prawami czytania, ls -la | grep a$ - wypisuje liste plikow i katalogow, ktorych ostatnia litera to "a", ls -laR | grep ^[d,-][r,-][w,-]s - wypisze liste plikow i katalogow, ktore maja prawa root`a podczas wykonywania. opcje: -i nie odroznia malych i wielkich liter, -l wypisuje nazwy plikow, w ktorych wystapil wzorzec, -r rekurencja. - prawa dostepu do plikow i katalogow: Po wpisaniu polecenia "ls -l" zostanie wyswietlona szczegolowa lista plikow i katalogow. Pierwszy znak pierwszego pola wyszczegolnia czy mamy do czynienia z katalogiem, plikiem lub urzadzeniem specjalnym, kolejne 9 znakow okresla prawa dostepu ... chown user filename ----+ +------- chgrp group filename | | drwxr-xr-x 6 root root 1024 Oct 10 00:59 programy ^ | +---- +-----------+----------------+---------------+---------------+ | |d (katalog)|prawa wlasne| prawa | prawa | | | - (plik) |dostepu do pliku| grupy | pozostalych | chmod | l (link) | lub katalogu | | | +------------+---------------+---------------+---------------+ | d | r w x | r w x | r w x | | | | | | | | 4 2 1 | 4 2 1 | 4 2 1 | +-----------+----------------+---------------+---------------+ polecenia zmiany: chmod - zmiana praw dostepu do pliku lub katalogu, chown - zmiana wlasciciela pliku lub katalogu, chgrp - zmiana grupy. oznaczenia: d - katalog (gdy "-" to plik), r - czytanie (listowanie zawartosci dla katalogu), w - zapis, x - uruchamianie (wchodzenie do katalogu). chmod [ugoa][-+=][rwxXstugo...] filename lub chmod octal filename - octal: 3-cyfrowa liczba skladajaca sie z cyfr od 0 do 7 ugoa - user (uzytkownik), group (wlasna grupa), other (pozostali spoza grupy), all (wszyscy). + - dodanie praw, - - odebranie praw, = - ustawienie praw wedlug podanych. rwxXstugo ^ | +----- r - read, w - write, x - execute (lub dostep do katalogow tak jak opcja "X"), X - nadaje prawo (lub je odbiera z "-") wchodzenia do katalogow (dziala tak jak "x" ale tylko dla katalogow), s - SUID/SGID, t - sticky bit, u - pozwolenie dla uzytkownika, g - pozwolenie dla grupy, o - pozwolenie dla innych uzytkownikow. przyklady: chmod ug+rx plik - dodanie (do aktualnych praw pliku) uzytkownikowi oraz grupie praw czytania i uruchamiania pliku "plik", chmod o-w plik - odebranie uzytkownikom spoza grupy praw pisania do pliku "plik", chmod a+r plik - nadanie wszystkim praw czytania pliku "plik", chmod u-X katalog - odbiera prawo dostepu do katalogu "katalog" (gdyby "katalog" byl plikiem to polecenie nie zostanie wykonane), chmod u-x katalog - to samo co wyzej, ale dziala rowniez na plikach, chmod 750 plik - nadanie praw: rwx dla uzytkownika (7), r-x dla grupy (5), --- dla pozostalych (0). w tabelce powyzej podano cyfry odpowadajace poszczegolnym bitom "r" = 4, "w" = 2 i "x" = 1, oktalna cyfre okreslajaca 3-bitowe prawa dostepu dla uzytkownika, grupy lub pozostalych tworzy sie poprzez zsumowanie cyfr odpowiadajacych bitom, ktore chcemy ustanowic aktywnymi. Np. prawa "r-x" to 4 + 1 czyli 5, chmod a=rwx plik - nadanie wszystkich praw wszystkich uzytkownikom, chmod a+rwx plik - to samo co wyzej. prawa dostepu do katalogow: Dla uproszczenia ogranicze sie tylko do opisu praw dostepu dla grupy (oczywiscie jest tu pelna analogia dla uzytkownikow i pozostalych). Istotne sa operacje, ktore mozna wykonac na katalogu jesli ma on ustawiony tylko bit "x" albo "r". Pozostale bity oraz ich kombinacje sa latwe do przewidzenia. Jesli katalog ma ustawiony tylko bit "x" dla grupy to inni uzytkownicy w obrebie tej samej grupy: - moga wejsc do tego katalogu ("cd katalog"), - NIE moga wyswietlac zawartosci katalogu ("ls katalog", lub "ls" bedac w katalogu), - maja prawa dostepu do zbiorow zawartych w tym katalogu (o ile zbiory te maja ustawione prawa dostepu umozliwiajace dostep dla innych osob). Moga np. wyswietlic zawartosc jakiegos pliku w tym katalogu (jesli ma on odpowiednie prawa dostepu) - musza jednak wiedziec, ze plik taki tam instnieje (nie maja przeciez prawa wyswietlania zawartosci ktalogu). Moga rowniez wejsc do jakiegos podkatalogu (jesli wiedza, ze takowy sie tam znajduje) i dokonac na nim roznych operacji (np. wyswietlic jego zawartosc, wyswietlic zawartosc pliku w tym katalogu jesli plik i podkatalog maja sprzyjajace prawa dostepu - podsumowujac: na podkatalogach mozna dokonywac operacji zgodnych z ustawionymi dla nich prawami dostepu, nie obowiazuja tu prawa dla katalogu nadrzednego). Jesli katalog ma ustawiony tylko bit "r" dla grupy to inni uzytkownicy w obrebie tej samej grupy: - moga wyswietlac zawartosc katalogu (ale tylko pierwszy poziom zaglebienia), - NIE moga wejsc do katalogu - nie maja dostepu do zadnych jego zasobow (nawet jesli pliki i katalogi wewnatrz tego katalogu maja sprzyjajace prawa dostepu) ! W tym, nie moga wyswietlac zawartosci plikow, wchodzic do podkatalogow, listowac podkatalogow. +---+ |FTP| +---+ Program "ftp" (File Transfer Protocol) sluzy do przesylania plikow pomiedzy komputerami polaczonymi siecia. Dzieki temu programowi mozemy polaczyc sie z innym komputerem (jesli udostepnia on usluge FTP oraz mamy tam konto lub istnieje "konto publiczne") i przesylac lub pobierac pliki. uruchomienie programu poprzez wydanie polecenia `ftp': open mh4000 - otwarcie polaczenia z serwerem mh4000 (mozna tez wydac polecenie "o nazwa_serwera"), cd - poruszanie sie po katalogach, help - wyswietlenie pomocy, get plik - pobranie pliku ze zdalnego komputera na lokalny, put plik - wyslanie pliku z komputera lokalnego na zdalny, mget * - pobranie plikow pasujacych do zadanego wzorca (podobnie jak get), mput * - wyslanie plikow pasujacych do wzorca na zdalny komputer, prompt - wlacza / wylacza akcje polegajaca na zadawaniu pytan o to czy dany plik pobrac (lub wyslac) po kazdym pliku przesylanym poleceniami mget lub mput (przydatne w przypadku przesylania znacznych ilosci plikow), bin - (lub binary) poinformowanie serwera o tym, ze przesylane pliki beda plikami binarnymi, a nie tekstowymi (niezbedne w przypadku przesylania programow i innych plikow binarnych - w przeciwnym przypadku pliki zostana uszkodzone poprzez obciecie 8-ego bitu kazdego znaku !), bye - zakonczenie polaczenia oraz zamkniecie programu. ----------------------------------------------------------------------------- Edytory plikow tekstowych: vi - uruchamia edytor tekstu: | |--- wyjscie z edytora: escape, :q! +---- zapisanie pliku: escape, :w! vim - nowsza wersja "vi" joe - prosty edytor, dla poczatkujacych najlepszy (ctrl+k a nastepnie ctrl+d powoduje zapisanie pliku, ctrl+k a nastepnie ctrl+x powoduje wyjscie z edytora) ----------------------------------------------------------------------------- - operacje na tekscie w plikach (strumieniach): polecenie "head" (wypisuje okreslony ciag znakow liczac od poczatku pliku): head -c100 plik - wypisuje 100 pierwszych znakow z pliku "plik", head -c1b plik - wyswietla 1 blok o dlugosci 512 znakow, head -c5k plik - wyswietla 5 blokow o dlugosci 1 kilobajt kazdy, head -c3m plik - wyswietla 3 bloki o dlugosci 1 megabajt kazdy, head -15 /etc/passwd - wyswietla 15 pierwszych linii danego pliku, head -n15 plik - wyswietla 15 pierwszych linii pliku "plik". polecenie "tail" (wypisuje okreslony ciag znakow liczac od konca pliku): tail -c100 plik - wypisuje 100 ostatnich znakow z pliku "plik", tail -15 plik - wypisuje 15 ostatnich linii pliku "plik", tail -n15 plik - tak samo jak wyzej, tail +15 plik - wypisuje od linii 15 wlacznie do konca pliku. uwaga: kolejne wiersze wypisywana sa w kolejnosci od poczatku do konca plik. Np. gdy kolejne wiersze pliku zawieraja liczby od 1 do 15 to wydanie polecenia "tail -n5 plik" spowoduje wypisanie wierszy "11", "12", "13", "14" i "15" w tej kolejnosci. polecenie "wc" (wypisuje liczbe linii, slow i znakow w pliku): wc /etc/passwd 21 25 738 /etc/passwd w tym przypadku plik "/etc/passwd" zawiera 21 wierszy, 25 slow i 738 znakow wc -l plik - wypisuje tylko liczbe linii w pliku, wc -w plik - wypisuje tylko liczbe slow w pliku, wc -c plik - wypisuje tylko liczbe znakow w pliku. ls -la | wc -l - wyznaczy liczbe linii wypisana przez polecenie "ls -la", ls -alR | wc -l - liczba linii lacznie z podkatalogami, ls -alR | grep ^d | wc -l - liczba podkatalogow w drzewie (uwzglednia katalogi specjalne "." i ".."). - obliczenia wyrazen arytmetycznych "expr": expr 11 + 13 - wypisze wartosc sumy liczb 11 i 13, expr 134 "*" 18 - wypisze wartosc iloczynu liczb 134 i 18 (znak "*" musi byc w cudzyslowach, gdyz inaczej zostalby zinterpretowany przez shell`a jako znak specjalny), expr 134 \* 18 - to samo co wyzej, - polecenie "echo" (wypisuje linie tekstu): echo Ewa - wypisze swoj argument "Ewa", echo *.* - wypisze liste wszystkich plikow, ktore posiadaja "." w swojej nazwie, echo *a* - wypisze liste plikow, ktore posiadaja znak "a" w swojej nazwie, echo * - wypisze liste wszystkich plikow, echo "*" - wypisze znak "*", echo '*' - wypisze znak "*", echo -n napis - wyswietla napis i nie przechodzi do nowego wiersza, echo $HOME - wyswietlenie danych zapisanych pod zmienna srodowiskowa "home", echo "$HOME" - nie zmienia srodowiskowego znaczenia "$" (to samo co wyzej), echo '$HOME' - traktuje zapis doslownie (wypisze napis "$home"), echo `date` - wypisze date systemowa (najpierw wykonane zostaje polecenie pomiedzy `..` a potem echo). expr `ls -al | wc -l` - 1 - autentyczna (bez napisu "total") liczba plikow i katalogow w aktualnym podkatalogu, ls -la | grep ^d | wc -l - wypisuje liczbe katalogow w aktualnym podkatalogu ("ls" wypisuje szczegolowa i kompletna liste katalogow i plikow w oddzielnych liniach, "grep" otrzymuje dane z "ls" i wypisuje te z nich, ktore maja znak "d" na poczatku wiersza, "wc" wypisuje liczbe linii wygenerowanych przez "grep"). Ujecie znaku "*" w cudzyslowy podowuje, ze NIE zostanie on rozwiniety w liste plikow, ten sam efekt uzyskamy piszac '*'. W stosunku do zmiennych srodowiskowych (np. $NAZWA_ZMIENNEJ) zapis echo "$ZMIENNA" lub echo $ZMIENNA daje ten sam efekt - wypisanie wartosci zmiennej na ekran, ujecie wyrazenia w apostrofy echo '$ZMIENNA' powoduje wypisanie napisu $ZMIENNA. Znaki ` ` (odwrocony apostrof - ten sam klawisz co tylda) ma znaczenie specjalne. Wyrazenie objete tymi znakami zostaje wywolane tak jak komenda shella ... Polecenie echo `date` powoduje, ze shell uruchomi polecenie "date" a napisy zwrocone przez to polecenie (w tym przypadku data i czas systemowy) zostana przekierowane do "echo", ktore to wypisze je na ekran. - polecenie "sort" (sortuje wiersze w pliku tekstowym): sort plik - wypisuje posortowane wiersze z pliku "plik", sort -c plik - sprawdza czy plik jest posortowany, sort -r plik - sortuje w kolejnosci odwrotnej, sort -f plik - nie rozroznia wielkich i malych liter, sort -n plik - sortuje numerycznie, sort -o wyjscie plik - posortowany plik "plik" zapisuje do pliku "wyjscie", sort -tx +POS1 [-POS2] plik - separator "x" dzieli linie na poszczegolne pola ; sortowanie odbywa sie od wskazanego znaku wskazanego pola (do wskazanego znaku wskazanego pola - gdy podano), sort -t- +0.0 plik - linie w pliku zostana podzielone na pola znakiem "-", linie zostana posortowane zaczynajac od pierwszego znaku, pierwszego pola (numeracja od 0 - pierwsze pole ma zatem numer 0), +0.0 | | | +----- numer znaku w polu | +------- numer pola sort -t- +1.0 plik - sortowanie zaczynajac od pierwszego znaku drugiego pola (pola oddzielone separatorem "-"), sort -t- -n +1.0 plik - sortowanie numeryczne zaczynajac od pierwszego znaku drugiego pola (kolejno: 07, 13, 18), plik wejsciowy: adam-13 ala-07 ola-18 wyjscie: ala-07 adam-13 ola-18 sort -t- -n +1.1 plik - sortowanie numeryczne zaczynajac od drugiego znaku drugiego pola (kolejno: 3, 7 , 8), plik wejsciowy: adam-13 ala-07 ola-18 wyjscie: adam-13 ala-07 ola-18 - polecenie "cut" (wycina ciag znakow z kazdego wiersza): cut -b lista plik - wypisuje te znaki kazdej linii pliku, ktorych pozycje okresla "lista", cut -f lista -d separator plik - wypisuje wskazane na "lista" pola oddzielone przez "separator". gdzie lista jest postaci: 1- od znaku 1 wlacznie do konca linii, -3 od poczatku linii do znaku 3 wlacznie, 2-3 od znaku 2 wlacznie do znaku 3 wlacznie. cut -b -4,8- plik - wypisuje znaki od 1 do 4 i od 8 do konca wiersza, cut -b 1-3 plik - wypisuje znaki od 1 do 3 dla kazdego wiersza, cut -f 1-1 -d- plik - wypisuje pola od 1 do 1 (pola oddziela separator "-"), cat /etc/passwd | grep ^`whoami` | cut -f4 -d: - wypisuje grupe uzytkownika, ls -laR 2>/dev/null | cut -b 4- | grep ^s - wypisuje liste plikow (w glab aktualnego katalogu), ktore posiadaja prawa root`a podczas wykonywania (patrz: przyklad dla polecenia "grep"). - struktura katalogow unixa: /home/students - katalogi studentow, /dev - urzadzenia, /proc - obraz pamieci i procesow (jest to tylko obraz, a nie fizyczny plik, ktory zajmuje miejsce na dysku), /etc - pliki konfiguracyjne systemu, /sbin - programy administratora, /bin, /usr/bin, /usr/local/bin /usr - oprogramowanie uzytkownikow. sa tu ustawienia domyslne i moga byc inne w roznych systemach - polaczenia pomiedzy plikami `linki' - polecenie `ln': Link jest to plik (katalog), ktory wskazuje na inny plik (katalog). ln plik_istniejacy nowa_nazwa ln a b a b ^ ^ \ / \ / +-----+ |plik | +-----+ - linki twarde (tylko dla root`a): a _ / \ / \ x \ a | / \ \_/ x y - miekkie `symboliczne' linki: ln -s plik_istniejacy skrot skrot ----> plik_istniejacy - polecenie "find" (szuka plikow w hierarchii katalogow): find / -name ala - wyszuka rekurencyjnie wszystkie pliki `ala' zaczynajac od glownego katalogu. +-------------------------+ | PROGRAMOWANIE W SHELL`u | +-------------------------+ Programowanie w shell`u polega na tworzeniu plikow ze "skrypatmi", ktore beda nastepnie interpretowane przez standardowy shell: sh, ksh, csh, lub inny. Programowanie to podobne jest do pisania plikow batch`owych pod DOS`a lecz jest niewspolmiernie bardziej wydajne i rozbudowane. zmienne: -------- Uwaga: Nie istnieje pojecie deklaracji zmiennych ! Uwaga: Wyrazenie inicjalizujace zmienna musi stanowic spojny ciag znakow (bez spacji) ! inicjalizacja zmiennej: liczba=1 lub napis=Witaj swiecie lub napis="Witaj swiecie" uzycie zmiennej: $liczba $napis polecenia: ---------- read - wczytanie wartosci pod zmienna, skladnia: read zmienna przyklad 1: echo -n "Jak sie nazywasz ?" read nazwisko echo "Witaj $nazwisko." przyklad 2: echo "Ile masz lat ?" read wiek echo "Ktory jest teraz rok ?" read rok echo "Urodziles sie w `expr $rok - $wiek` roku." trap - zostanie wywolane, gdy podczas wykonywania skryptu ktos uzyje ctrl + c, skladnia: trap "polecenie ; polecenie ; ... ; polecenie" przyklad 1: trap "echo 'dlaczego chcesz wyjsc z programu ?' ; echo 'nie podoba ci sie ?' " exit - wyjscie ze skryptu z kodem powrotu, skladnia: exit [liczba] - liczba (kod powrotu) jest opcjonalna konstrukcje sterujace: ---------------------- skladnia: if warunek then wykonaj else wykonaj fi przyklad 1: if test -f "$1" # testowanie istnienia pliku then echo plik istnieje else echo brak takiego pliku fi przyklad 2: if [ -f "$1" ] # zamiast slowa test mozna uzyc notacji [ ... ] then echo plik istnieje else echo brak takiego pliku fi mozna takze stosowac zapis z "then" w tym samym wierszu co "if": if [ 1 -eq 1 ]; then wybor wariantu: --------------- w zaleznosci od wartosci zmiennej "zmienna" zostanie wykonany skok do odpowiadajacej jej etykiety; skladnia: case zmienna in 1) polecenie;; 2) polecenie; polecenie;; 3) polecenie; polecenie; polecenie;; *) polecenie;; esac przyklad 1: echo "Wybierz:" echo "(L)ista plikow, (D)ata systemowa, (W)yjscie do shell`a" read wybor case $wybor in L) echo "oto lista plikow:"; ls -al | grep ^- ;; D) echo "oto aktualana data:"; date;; W) echo "do zobaczenia."; exit;; *) echo "brak takiego polecenia";; esac petle: ------ wystepuja dwa rodzaje petli: for i while; for: skladnia: for zmienna in cokolwiek1, cokolwiek2, ..., cokolwiekn do ... ... done Uwaga: po `in' wystepuje lista parametrow, nie ma mozliwosci zdefiniowania (tak jak np. w jezyku C) przedzialu ! przyklad 1: for licznik in 1 2 3 4 5 do echo $licznik done na ekranie: 1 2 3 4 5 przyklad 2: echo "Podczas mojej podrozy do USA bylem w" for nazwy in Kalifornii Alabamie Arkansas do echo $nazwy done na ekranie: Podczas mojej podrozy do USA bylem w Kalifornii Alabamie Arkansas przyklad 3: suma=0 for i do suma=`expr $suma + $i` done echo Suma = $suma przyklad 4 (sumuje podane po `in' liczby): suma=0 for i in 1 2 3 4 5 6 7 8 9 10 do suma=`expr $suma + $i` done echo "Suma = $suma" testowanie wartosci zmiennych: ------------------------------ skladnia: test zmienna op zmienna +-----+----------+-----------------+ | op | operator | znaczenie | | | arytmet. | | +-----+----------+-----------------+ | -eq | == | rowny | | -ne | != | rozny | | -gt | > | wiekszy | | -lt | < | mniejszy | | -ge | >= | wiekszy-rowowny | | -le | <= | mniejszy-rowny | +-----+----------+-----------------+ jesli warunek jest spelniony zwracane jest zero; przyklad 1: test 5 -eq 5 zwrocone zostanie 0; przyklady zastosowania: przyklad 1: if test 100 -eq 100; then echo "100 jest rowne 100" fi zostanie wykonany test czy liczba 100 jest rowna liczbie 100, jesli tak to zostanie wypisany napis. przyklad 2: echo -n "podaj liczbe: " read liczba if test $liczba -eq 100; then echo "twoja liczba to 100" else echo "twoja liczba to nie 100" fi jesli wprowadzona liczba to 100 zostanie wypisany pierwszy napis, w przeciwnym przypadku zostanie wypisany drugi napis przyklad 3: echo -n "podaj liczbe: " read liczba if [ $liczba -eq 100 ]; then echo "twoja liczba to 100" else echo "twoja liczba to nie 100" fi to samo co w przykladzie 2. zamiast slowa kluczowego "test" mozna zawrzec wyrazenie w nawiasy kwadratowe "[ ]" wyrazenia arytmetyczne: ----------------------- Aby wypisac roznice liczb 7 i 3 nie wystarczy napisac: echo 7 - 3 na ekranie: 7 - 3 Do wyznaczania wartosci wyrazen arytmetycznych sluzy polecenie "expr". skladnia: expr [zmienna, liczba] op [zmienna, liczba] +-----+-------------+ | op | znaczenie | | | | +-----+-------------+ | + | suma | | - | roznica | | * | iloczny | | / | iloraz | | ^ | potegowanie | +-----+-------------+ Uwaga: W roznych systemach moze wystepowac rozna skladnia ! przyklad 1 dla systemu LINUX: zmienna=`expr 4 + 5` zamiast expr mozna stosowac notacje $[ ... ], np. echo $[ 5 + 7 ]