Kurs BASH.pdf

(417 KB) Pobierz
185962275 UNPDF
Kurs BASH
Bash to powloka systemowa UNIX napisana dla projektu GNU. Nazwa jest akronimem od Bourne-Again
Shell (ang. znowu shell Bourne'a). Jest to jedna z najpopularniejszych powlok systemów uniksowych.
Wywodzi sie od powloki Bourne'a sh, która byla jedna z pierwszych i najwazniejszych powlok systemu
UNIX, i zawiera pomysly zawarte w powlokach Korna i csh. Pierwotna powloka Bourne'a byla tworzona
przez Stephena Bourne'a. Bash byl pisany glównie przez Briana Foxa i Cheta Rameya. Powloka Bournea sh
zostala stworzona okolo roku 1977. Powloka bash zostala napisana w roku 1987 przez Briana Foxa. W roku
1990 jej glównym opiekunem zostal Chet Ramey. Bash jest domyslna powloka w wiekszosci dystrybucji
systemu Linux oraz w systemie Mac OS X w wersji 10.4 Tiger. Istnieja takze wersje dla wiekszosci systemów
Unixowych. Bash jest takze domyslna powloka w srodowisku Cygwin dla systemów Win32. Program jest
rozprowadzany na licencji GPL. Bash jest bardzo dobrym jezykiem skryptowym, sluzacym do efektywnego
zarzadzania systemem.
Skrypt to nic innego jak zwykly jawny nie skompilowany plik tekstowy zawierajacy rózne instrukcje,
polecenia systemowe, do wykonania przez zdefiniowany w skrypcie interpreter powloki systemowej
(/bin/bash). Zadaniem powloki jest przetlumaczenie ich na polecenia systemu. Jesli ktos mial do czynienia z
plikami wsadowymi (Batch) w systemie DOS to wlasnie skrypty sa tego typu plikami.
Kurs BASH
Hello World i wykonanie skryptu
Tradycyjnie pierwszym krokiem do pisania wlasnego kodu jest wyswietlenie na standardowym wyjsciu
(stdout), tutaj ekran monitora, oslawionego tekstu "Hello World".
Zakladajac ze pracujemy np. w Linuksowej konsoli, w której mamy za powloke obrana wlasnie powloke bash
wystarczy wydac komende:
echo "Hello World"
Na wyjsciu dostaniemy w odpowiedzi napis Hello World. Dlaczego tak sie dzieje? Otóz pracujac w powloce
bash od razu jestesmy w srodowisku w którym wykonujemy kod - powloka interpretuje bezposrednio
polecenia dla niej zrozumiale i natychmiast podaje nam wynik dzialania instrukcji na nasz ekran. A teraz do
rzeczy. Napiszmy prosty skrypt który wlasnie wydrukuje nam na nasz ekran monitora nasze Hello World.
Kazdy skrypt powinien zawierac na poczatku zdefiniowany rodzaj shella w jakim skrypt ma byc wykonany:
#!/bin/bash lub krócej #!/bin/sh
tutaj skrypt zawsze bedzie wykonywany przez interpreter polecen bash, niezaleznie od tego jakiej powloki w
danej chwili uzywamy. Przykladowo pracujemy w powloce csh, skrypt na czas wykonania zawartego w nim
kodu wywola powloke bash:
tworzymy plik tekstowy o nazwie hello.sh
touch hello.sh
nastepnie edytujemy utworzony plik dowolnym edytorem np. pico, vi, vim, joe:
pico hello.sh
#wypelniamy nasz pusty plik ponizszym kodem:
#!/bin/bash
#Nastepnie piszemy kod:
echo "Hello World"
#koniec skryptu
185962275.002.png
Uwaga:
"#" oznacza komentarz w skrypcie. Interpreter kodu pomija wszystko zawarte za # do konca linii, mozemy w
ten sposób zamieszczac w skrypcie swoje komentarze.
Zapisujemy zmiany i oto mamy swój pierwszy skrypt, który nalezy uruchomic. Jest kilka sposobów na
uruchamianie skryptów. Wiele poradników nakazuje nadac plikowi prawo wykonania aby go uruchomic -
owszem jest to poprawne jednak nie niezbedne, skrypty mozemy uruchamiac na kilka sposobów, najprostszy
sposób uruchomienia skryptu to wydanie komendy sh (dla bash): sh skrypt.sh - taki sposób uruchamiania
skryptu pozbawia nas potrzeby umieszczania na poczatku kodu definicji powloki #!/bin/bash, poniewaz sh
oznacza: wykonaj skrypt w powloce bash. Jezeli nie podamy w skrypcie definicji powloki, ani tez nie
wykonamy skryptu poleceniem sh, skrypt nasz zostanie wykonany w domyslnej powloce w jakiej wlasnie jest
wywolywany, w linuksie zazwyczaj domyslna powloka jest bash.
W naszym przykladzie zakladajac ze jestesmy w tym samym katalogu co nasz skrypt wydajemy polecenie:
sh hello.sh
w przeciwnym wypadku musimy podac pelna sciezke dostepu do skryptu:
sh / home / user / skrypty / hello.sh
co nam wyswietli na wyjsciu, na monitorze tresc:
Hello World
Inny sposób wykonania skryptu, to nadanie mu prawa, atrybutu do wykonania czyli:
chmod + x hello.sh
nastepnie aby wykonac skrypt wystarczy wydac polecenie:
. / hello.sh
#lub
. / home / user / skrypty / hello.sh
Kolejnym sposobem uruchamiania skryptów jest nadanie im praw do wykonania i umieszczenia sciezki do
skryptu w zmiennej PATCH, lub np. skopiowanie skrytu do katalogu /usr/sbin, wtedy wykonujemy nasz
skrypt tak jak inne programy zawarte w naszym systemie, wydajac po prostu polecenie:
hello.sh
Nazwa naszego pliku hello.sh posiada rozszerzenie .sh które nie jest konieczne, jednak dobrym nawykiem jest
nadawanie skryptom rozszerzen w celu latwiejszego ich identyfikowania przez nas samych jak i przez
róznego rodzaju edytory podswietlajace skladnie kodu, np. edytor zawarty w midnight commanderze
rozpoznaje rodzaj kodu po rozszerzeniu pliku i w sposób wygodny dla nas podswietla skladnie kodu podczas
edycji skryptu.
Ciekawostka:
Ogólnie #!/bin/powloka wcale nie musi byc powloka, moze byc dowolnym poleceniem, np. nastepujacy
skrypt sam sie kasuje:
#!/bin/rm
#Zawartosc skryptu nie jest istotna
#jakies tam polecenia
#End script
Powloka rozwinie to nam w /bin/rm ./nazwa_skryptu, czyli skasuj hello.sh
185962275.003.png
Polecenie ECHO
Echo jest poleceniem wyswietlajacym na ekranie swoje argumenty.
Skladnia:
#!/bin/bash
echo "jakis tekst" #wydrukuje na ekranie: jakis tekst
#End script
: nie jest wysylany znak nowej linii (kursor pozostaje w tej samej linii)
: wlacza inetrpretacje znaków specjalnych takich jak:
: alert, brzeczyk systemowy
: backspace
: to samo co -n
: escape
: line feed
: form feed czyli wysuw strony, nowa linia
: znak nowej linii powrót karetki (\f\r daje to samo co \n)
: tabulacja pozioma
: tabulacja pionowa
: backslash
: znak, którego kod ASCII ma wartosc ósemkowa
: znak, którego kod ASCII ma wartosc szesnastkowa
Przyklad:
echo -n "przykladowy tekst"
Jako ze w powloce znak backslash jest znakiem specjalnym, musimy go podwoić, badz wpisywac ciagi
znaków w cudzyslowach.
Przyklad:
#!/bin/sh echo -e \\a
sleep 1 #wstrzymanie skryptu na 1 sekunde
echo "peep"
echo -e "\a"
Here-Documents
'Here documents' - dokumenty miejscowe. Jest to rodzaj przekierowania, które pozwala czesc tresci skryptu
traktowac jako standardowe wejscie.
Skladnia:
<
here-document
ogranicznik
Przyklad:
#!/bin/sh
cat << KONIEC
Ten tekst zostanie
wyswietlony na ekranie
ogranicznikiem jest KONIEC
Parametry ECHO:
-n
-e
\a
\b
\c
\e
\f
\n
\r
\t
\v
\\
\nnn
\xnn
185962275.004.png
KONIEC
Po wykonaniu powyzszego skryptu otrzymamy na ekranie wszystko to co zawarlismy miedzy wyrazami
KONIEC. Ten sposób moze byc uzywany do wyswietlenia wiekszej ilosci informacji na ekran bez
koniecznosci wpisywania echo w kazdej linii. W dokumencie miejscowym dokonuje sie wszystkich
rozwiniec. Ogranicznik koncowy musi znalezc sie sam w jednej linii, dlatego ostatnie slowo KONIEC
pojawia sie na ekranie. Pierwszy ogranicznik moze byc dowolnym wyrazeniem, szczególy w podreczniku
systemowym.
Slowa zastrzezone (ang. reserved words)
Tak jak w kazdym jezyku programowania tak samo i w bashu wystepuja slowa zastrzezone, zarezerwowane,
które maja dla powloki specjalne funkcjonalne znaczenie, wtedy gdy nie sa cytowane. Glówne slowa to:
! case do done elif else esac fi for function if in select then until while { } time [ ]
Polecenie sleep i exit
Polecenie sleep powoduje wstrzymanie wykonywania instrukcji skryptu na okreslony czas:
#!/bin/bash
echo "teraz wstrzymam skrypt na 10 sekund"
sleep 10
echo "koniec papa..."
#End script
Polecenie exit
Polecenie exit powoduje natychmiastowe zakonczenie skryptu bez wzgledu na miejsce wywolania.
Dodatkowy parametr pozwala udostepnic otoczeniu kod wyjscia, który moze nalezec do przedzialu 0 - 125,
przy czym zero jest traktowane jako sukces. Kody powyzej 125 sa zarezerwowane i maja nastepujace
znaczenie:
Kody wyjscia > 125
126 - plik nie mial atrybutu wykonywalnosci "x"
127 - nie znaleziono pliku o zadanej nazwie
128 i w góre powodem zakonczenia byl jakis sygnal (wartosc kodu wyjscia równa jest 128 + numer sygnalu)
Piszac skrypty niejednokrotnie zalezy nam aby skrypt po zakonczeniu pracy, w zaleznosci od tego jakie czesci
skryptu sie wykonaly zwrócil odpowiedni status. A wiec jesli skrypt zakonczyl dzialanie bez bledu zwróci
nam status 0, natomiast jak cos pójdzie nie tak zwróci 1. A co jezeli polowa skryptu wykona sie prawidlowo
natomiast druga nie wykona sie wcale a my chcemy o tym wiedziec - wtedy mozemy zastosowac exit z
odpowiednimi statusami.
Przyklad:
#!/bin/bash
#przenies zosia na mundek (zmien nazwe)
mv zosia mundek
if [ $? -eq 0 ]
then echo "Powodzenie"
else echo "blad" ; exit 4
fi
185962275.005.png
#tutaj moze byc dalsza czesc skryptu do wykonania
echo "papa"
#End script
Jezeli np. plik zosia nie istnieje to mamy niepowodzenie w wykonaniu skryptu i chcemy zeby w takim
przypadku skrypt po zakonczeniu zglosil kod 4. Jezeli natomiast polecenie mv zadziala bez bledu to zwróci
kod 0, instrukcja if sprawdzi czy status dzialania polecenia mv jest równy 0 i wyswietli powodzenie, oraz
skrypt bedzie wykonywany dalej i zakonczy sie powodzeniem i statusem 0, w przeciwnym wypadku wykona
sie druga czesc instrukcji - skrypt wyswietli tekst "blad" i wykonujac polecenie exit ze statusem 4 przerwie
dzialanie a dalsza czesc skryptu juz se nie wykona.
Potoki i przekierowania
Potoki i przekierowania pozwalaja zmieniac standardowe wejscie, wyjscie oraz standardowe wyjscie bledów
lub laczyc je w potoki. Mozna przekierowywac dowolne z deskryptorów, jednak w wiekszosci przypadków
wykorzystywane sa jedynie na standardowych wejsciach i wyjsciach.
Skladnia potoku:
polecenie1 | polecenie2 | polecenie3 | polecenien...
Potok jest ciagiem polecen porozdzielanych znakiem "|", przy czym standardowe wyjscie polecenia
poprzedzajacego jest standardowym wejsciem polecenia nastepnego.
Przyklad:
$ / sbin / ifconfig | grep HWaddr > wynik.txt
Jak widac pierwsze polecenie wywoluje polecenie ifconfig nastepnie polecenie drugie - program grep
wyodrebnia z wyniku dzialania ifconfig jedynie linie zawierajaca adres MAC karty sieciowej i caly wynik
dzialania potoku jest zapisywany do pliku o nazwie wynik.txt - ta ostatnia operacja to wlasnie
przekierowanie...
Przekierowania
Deskryptor (ang. descriptor) - struktura definiujaca okreslony obiekt w pamieci.
Przed wykonaniem polecenia powloka sprawdza, czy nie powiazac okreslonych deskryptorów innymi, badz z
plikami. Przekierowanie wejscia [n] < plik powoduje otwarcie pliku do czytania i powiazanie deskryptora o
numerze n z zawartoscia pliku. Jesli pominiemy numer deskryptora powloka przekieruje standardowe wejscie
(deskryptor nr 0).
Przyklad:
$ mail jakis @ adres.com This e-mail address is being protected from spambots, \
you need JavaScript enabled to view it < wiadomosc.txt
Przekierowanie wyjscia [n] > plik powoduje otwarcie pliku do pisania i powiazanie go z deskryptorem o
numerze n. Jesli plik nie istnieje zostanie stworzony, jesli istnieje zostanie skrócony do zera (patrz opcja
noclobber ) . Gdy pominiemy numer deskryptora powloka przekieruje standardowe wejscie (deskryptor nr 1).
Przekierowanie wyjscia z dopisywaniem [n] >> plik powoduje otwarcie pliku do dopisywania (jesli nie
istnieje zostanie stworzony) i powiazanie go z deskryptorem o numerze n. Gdy pominiemy numer deskryptora
powloka przekieruje standardowe wejscie. Przekierowanie wyjscia i standardowego wyjscia &> plik
powoduje otwarcie pliku do pisania i powiazanie go ze standardowym wyjsciem i standardowym wyjsciem
bledów. Powyzsze definicje nie zbyt jasno tlumacza róznice miedzy przekierowaniem wyjscia i wejscia. Na
185962275.001.png
Zgłoś jeśli naruszono regulamin