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 ]





