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 ]

w3cw3c
automatyka przemysłowa