Professional Documents
Culture Documents
1. Wstp
Skrypt shellowy to nic innego jak bardziej rozbudowana wersja listy pewnych polece, ktre
maj zosta wykonane przez system. Zgodnie z oglnie przyjt konwencj, kady
powstajcy skrypt (dziaajcy w BASH-u) powinien si zaczyna od nastpujcej linijki:
#!/bin/bash
Linia ta jest o tyle istotnie, e przy jej pomocy definiujemy powok, ktra bdzie
odpowiedzialna za wykonanie cigu instrukcji umieszczonych wewntrz skryptu.
Pomimo tego, e pominiecie tej linii spowoduje, e skrypt bdzie dziaa, zaleca si jej
stosowanie, poniewa skadnia rozmaitych powok moe si nieznacznie rni, a w
rezultacie uruchomiony skrypt moe wywietla rne wyniki (bdzie raz dziaa, a raz nie)
w zalenoci od tego, pod jak powok zostanie uruchomiony.
2. Pierwszy skrypt.
Jak to zazwyczaj bywa podczas nauki pisania programw, pierwszym wykonanym
programem przez osob pragnc zgbi tajniki danego jeyka programowania jest program
wywietlajcy krtki tekst na monitorze. Aby nie odstpowa od tych powszechnie
przyjtych norm, take w Bash-u pierwszym skryptem, ktry zostanie napisany w tym kursie
bdzie skrypt, ktry wywietli na ekranie monitora krciutki tekst.
Skrypt, ktry to wykona jest niezwykle prosty i skada si z dwch linijek kodu:
#!/bin/bash
echo Moj pierwszy skrypt
Uruchomienie tego skryptu spowoduje wywietlenie na ekranie monitora komunikatu o treci:
Moj pierwszy skrypt
a nastpnie przejcie do nastpnej linii (aby pozosta w tej samej linii naleaoby po sowie
echo wstawi parametr n co wygldaoby tak: echo n Mj pierwszy skrypt).
Jak si mona atwo domyle polecenie echo odpowiada za wywietlenie tekstu na ekranie
monitora.
Bardzo czsto stosowan praktyk wrd programistw jest komentowanie poszczeglnych
linii powstajcego kodu. Take i w BASH-u jest to moliwe, a dokonuje si tego przy uyciu
znaku # co w rezultacie wyglda nastpujco:
#!/bin/bash
echo Moj pierwszy skrypt #wywietlenie tekstu na monitorze
Pewnie dla wikszoci osb czytajcych ten tekst, a ktre miay ju wczeniej styczno z
programowaniem (chociaby w Pascalu) od razu rzuca si w oczy, e cig instrukcji nie jest
zakoczony znakiem rednika, a same rdo skryptu nie znajduje si pomidzy sowami
kluczowymi begin i end. S to jedne z wielu rnic, ktre wystpuj pomidzy zwykym
programowaniem, a pisaniem skryptw powoce BASH.
UWAGA
Po zapisaniu skryptu do pliku naley pamita o nadaniu temu plikowi odpowiednich praw do
jego wykonywania w przeciwnym przypadku skrypt nie zadziaa.
3. Zmienne.
W kadym jzyku programowania potrzebne s zmienne, aby przy ich pomocy wykona
pewne operacje. Take w skryptach basha-a mona uywa zmiennych, a definiuje si je w
nastpujcy sposb:
ZMIENNA=witam # jeeli w wartoci zmiennej nie ma spacji nie trzeba uywa znaku
cudzysowie
lub
ZMIENNA=12345 # jeeli przypisujemy liczby lub cyfry nie uywamy znaku cudzysowie
lub
ZMIENNA=witam was # jeeli w wartoci zmiennej znajduje si znak spacji, to warto t
trzeba umieci w cudzysowie w przeciwnym wypadku bdzie to zinterpretowane jako
bdny zapis.
Zmienne mona zadeklarowa w dowolnym dla programisty momencie, a ponadto nie trzeba
nadawa im odpowiedniego typu tak jak to ma miejsce w innych jzykach programowania
(np. pascal, c , c++ ). Podczas deklarowania zmiennych i przypisywania im pewnych wartoci
naley zwrci uwag na jedn bardzo istotn rzecz, a mianowicie po obu stronach znaku =
(ktry suy do przypisania wartoci do zmiennej) nie mog znajdowa si spacje poniewa
spowoduje to powstanie bdu.
ZMIENNA = witam #bdny zapis !!!
Powyszy zapis jest bdny, poniewa shell interpretuje lini polece jako komend i jej
argumenty, ktre s rozdzielone znakiem spacji, zatem zapis ZMIENNA = witaj zostanie
zinterpretowany w ten sposb, e sowo ZMIENNA bdzie uwaane za polecenie, natomiast
znak = i sowo witaj bd uwaane za parametry do tego polecenia. Zapis
ZMIENNA=witaj zostanie zinterpretowane jako polecenie, co jest jak najbardziej poprawne.
Kolejn istotn rzecz, o ktrej naley wspomnie przy omawianiu zmiennych, jest fakt, e
ich nazwy pisze si duymi literami (oczywicie jak kto nazw zmiennej napisze maymi
literami to si nic nie stanie i skrypt bdzie dziaa poprawnie, ale przy programowaniu
skryptw przyjo si, e nazwy zmiennych s pisane duymi literami).
Bardzo istotny jest rwnie fakt, e BASH rozrnia due i mae litery, zatem odwoywanie
si do zmiennej odbywa si przez uycie dokadnie takiej samej nazwy zmiennej przy
pomocy jakiej ta zmienna zostaa zadeklarowana (jeeli nazwa zadeklarowanej zmiennej jest
napisana duymi literami, a odwoanie do niej odbywa si poprzez podanie jej nazwy z
maych liter to oczywicie odwoanie to nie przyniesie oczekiwanego rezultatu, poniewa taka
zmienna nie istnieje).
w obu, przedstawionych powyej przypadkach efekt bdzie taki sam na ekranie monitora
pokae si napis:
Mj pierwszy skrypt
jednake rnic w tych konstrukcjach zobaczymy na przykadzie prostego skryptu:
#!bin/bash
ZMIENNA=Mj pierwszy skrypt
echo $ZMIENNA
echo $ZMIENNA
Po uruchomieniu powyszego skryptu na ekranie monitora ukae si nastpujcy rezultat:
Mj pierwszy skrypt
$ZMIENNA
zatem zasada jest bardzo prosta: wewntrz cudzysowie nazwy zmiennych ktre s
poprzedzone znakiem $ s zastpowane przez przypisan im warto, natomiast wewntrz
apostrofw nie.
Niekiedy zachodzi potrzeba, aby nazwy zmiennych uj w cudzysowy. Jest to istotne, gdy
warto zmiennej zawiera spacje lub jest pustym cigiem. Aby to zobrazowa naley
przeledzi dziaanie nastpujcego skryptu:
#!bin/bash
ZMIENNA=
if [ -n $ZMIENNA ]; then # -n sprawdza czy argument nie jest pusty
echo Zmienna o nazwie ZMIENNA nie jest pusta;
else
echo Zmienna o nazwie ZMIENNA jest pusta;
fi
Shell zinterpretuje warunek jako [ -n Ala ma kota ] co jest zapisem bdnym. Aby zapis by
poprawny naley go wykona w nastpujcy sposb
ZMIENNA=Ala ma kota
if [ -n $ZMIENNA ]; then
W tym przypadku shell zinterpretuje warunek jako: [ -n Ala ma kota ] co jest zapisem
poprawnym.
Mwic o zmiennych naley rozway jeszcze jeden przypadek, a mianowicie jak wypisa na
ekranie monitora warto danej zmiennej, a bezporednio za t wartoci (bez znaku spacji)
wywietli jaki tekst, np. wywietli warto ZMIENNA, a bezporednio za t wartoci
sowo stopni. Sprawa moe wydaje si prosta i na pierwszy rzut oka pewnie wikszo osb
napisaaby taki skrypt w nastpujcy sposb:
#!/bin/bash
ZMIENNA=49
echo $ZMIENNAstopni
$9 parametr nr 9
$# - liczba parametrw
$$ - numer procesu
Dziaanie parametrw zilustruje poniszy skrypt:
#!/bin/bash
echo nazwa skryptu: $0
echo liczba parametrow: $#
echo wszystkie parametry wywolana: $*
echo parametr pierwszy: $1
echo parametr drugi: $2
echo parametr trzeci: $3
echo numer procesu: $$
Po zapisaniu powyszego skryptu do pliku o nazwie skrypt1 jego wywoanie wyglda
nastpujco:
./skrypt1 123 434 2312
a wynik jego dziaania wyglda tak:
nazwa skryptu: ./skrypt1
liczba parametrow: 3
wszystkie parametry wywolania: 123 434 2312
parametr pierwszy: 123
parametr drugi: 434
parametr trzeci: 2312
numer procesu: 138
Oczywicie jest to najprostszy przykad uycia parametrw, poniewa parametry mona
wykorzystywa w bardziej skomplikowany sposb ni zaprezentowany tutaj.
5. Instrukcja CASE.
Podobnie jak w innych jzykach programowania tak i w skryptach pisanych pod basha mona
uywa instrukcji CASE. Skadnia tej instrukcji wyglda nastpujco:
case $ZMIENNA in
1) zadanie numer 1;;
2) zadanie numer 2;;
*) zadanie w kadym innym przypadku;;
esac
Instrukcja case zaczyna si od sowa case, a koczy si zapisaniem tego sowa od koca
(esac), a pomidzy tymi sowami wypisane s wszystkie opcje obsugiwane przez t
instrukcj. Zastosowanie konstrukcji *) obejmuje wszystkie pozostae moliwoci, ktre nie
zostay zdefiniowane w instrukcji case.
Dziaanie tej instrukcji obrazuje poniszy skrypt:
#!/bin/bash
case $1 in
piatek) echo weekend jest juz tuz tuz;;
sobota) echo juz weekend;;
niedziela) echo weekend si juz powoli konczy;;
poniedzialek) echo ju poniedziaek znowu trzeba isc do pracy;;
*) echo srodek tygodnia trzeba ciezko pracowac;;
esac
Wywoanie tego skryptu moe wyglda nastpujco:
a)
b)
c)
d)
b) w przypadku gdy naley wykona inny zestaw polece, jeeli zadany warunek koczy
si wynikiem negatywnym, skadnia polecenia wyglda nastpujco:
if warunek; then
wyraenie1;
else
wyraenie2;
fi
c) w przypadku gdy naley sprawdzi inny warunek jeeli wczeniejszy warunek nie
zosta speniony, skadnia polecenia if wyglda nastpujco (ilo wyrae elif jest
dowolna):
if warunek1; then
wyraenie;
elif warunek2; then
wyraenie2;
fi
Instrukcja warunkowa if dziaa w taki sposb, e polecenia wewntrz bloku if/fi, if/elif, a
nastpnie elif/fi jeli zadany warunek jest prawdziwy.
7. Zapis warunkw w instrukcji warunkowej IF.
Do testowania warunkw uywa si operatorw, ktre w wyniku swojego dziaania zwracaj
prawd lub fasz w zalenoci od tego czy sprawdzany warunek jest prawdziwy czy
nieprawdziwy. Zazwyczaj warunek jest zapisywany w nastpujcej postaci:
[ operand1 operator operand2 ]
W niektrych przypadkach warunki zapisuje si tylko przy pomocy jednego operandu
(drugiego - operand2). Bardzo istotny jest fakt, e pomidzy nawiasami, operandami
operandami operatorem musi istnie odstp w postaci spacji. Jeeli tego odstpu nie ma to
wtedy wszystko to co jest napisane midzy nawiasami kwadratowymi jest traktowane jako
jeden operand bez jakichkolwiek operatorw.
[$X=$Y] /# bdny zapis !!!
[ $X = $Y ] # zapis prawidowy
Ponadto bardzo istotne jest take uywanie znakw cudzysowu we wszystkich warunkach w
ktrych operator przyjmuje posta n (na pocztku kursu zostao wyjanione dlaczego).
8. Operatory instrukcji warunkowej IF.
Najczciej uywanymi operatorami w instrukcji warunkowej if s:
-n operand ma niezerow dugo (jeden operand)
-z operand ma zerow dugo (jeden operand)
-d istnieje katalog o nazwie operand (jeden operand)
-f sprawdza czy operand jest plikiem (jeden operand)
-e sprawdza czy zbir (plik, katalog) o nazwie operand (jeden operand) istnieje
-L sprawdzenie czy plik o nazwie operand jest dowizaniem symbolicznym (jeden operand)
-eq sprawdza czy operandy s rwnymi liczbami (dwa operandy)
-neq sprawdza czy operandy s rnymi liczbami (dwa operandy)
= - sprawdza czy operandy s jednakowymi cigami znakw (dwa operandy)
!= - sprawdza czy operandy s rnymi cigami znakw (dwa operandy)
-lt sprawdza czy operand 1 jest mniejszy operand2 (dwa operandy ktre s liczbami
cakowitymi)
-le sprawdza czy operand1 jest rwny lub mniejszy od operand2 (dwa operandy ktre SA
liczbami cakowitymi)
-gt sprawdza czy operand1 jest wikszy od operand2 (dwa operandy ktre SA liczbami
cakowitymi)
-ge sprawdza czy operand1 jest rwny lub wikszy od operand2 (dwa operandy ktre SA
liczbami cakowitymi)
Oczywicie nie s to wszystkie typy operatorw, ktre s dostpne w bashu, ale w zupenoci
wystarczaj do napisania wikszoci skryptw. Oczywicie istnieje moliwo poznania
reszty operatorw ktre s dostpne w bashu. Aby to uczyni naley skorzysta z manuala
wpisujc polecenie:
man bash
A oto prosty przykad skryptu wykorzystujcego instrukcj warunkow if
#!/bin/bash
if [ $1 eq $2 ]; then
echo liczby $1 i $2 sa rowne;
else
echo liczby $1 i $2 sa rozne;
fi
if [ -e $3 ]; then
echo plik o nazwie $3 istnieje;
if [ -L $3 ]; then
echo i jest dowizaniem symbolicznym;
elif [ -f $3 ]; then
echo i jest zwykym plikiem;
fi
else
echo plik o nazwie $3 nie istnieje
fi
Uruchomienie powyszego skryptu wyglda nastpujco:
./nazwa_skryptu 1 3 test.txt
Wynik dziaania skryptu wyglda nastpujco (zakadajc ze plik podany jako trzeci parametr
istnieje i e jest zwykym plikiem):
liczby 1 i 3 sa rozne
plik o nazwie test.txt istnieje
Ptla while dziaa tak dugo dopki warunek jest prawdziwy w przeciwnym razie ptla
koczy swoje dziaanie. Do sterowania ptl while istniej dwie instrukcje:
Nietrudno zauway, e skrypt ten bdzie wypisywa na ekranie monitora tekst liczba
<pierwszy parametr skryptu> jest mniejsza od liczby <drugi parametr skryptu>, po ktrym
nastpuje zwikszenie o jeden pierwszego parametru skryptu, dopki pierwszy parametr nie
bdzie rwny lub wikszy od drugiego parametru skryptu.
Rozwijanie
zawartoci
nawiasw
odbywa
si
w
nastpujcy
sposb:
$(polecenie_do_wykonania) zapis taki zostaje zastpiony przez wynik wykonania polecenia
znajdujcego si w nawiasach. Istotny jest fakt, e nawiasy mog by zagniedone, czyli
polecenia rwnie mog zawiera nawiasy.
Ujmowanie polecenia w tzw. wsteczne apostrofy:
`polecenie_do_wykonania` - zapis taki zostaje zastpiony przez wynik wykonania polecenia
znajdujcego si w nawiasach.
13. Funkcje
Piszc skrypty w bashu programista moe rwnie tworzy funkcje, ktre w bardzo duej
mierze przyczyniaj si do skrcenia kodu skryptu i zwikszaj jego przejrzysto.
Oglna posta funkcji wyglda nastpujco:
nazwa_funkcji()
{
instrukcje do wykonania
}
Przykadow funkcj mona zapisa w nastpujcy sposb:
dodawanie()
{
WYNIK=$(($1 + $2))
echo$WYNIK
}
Utworzon funkcj wywouje si podajc jej nazw i jeli zachodzi taka potrzeba parametry, z
jakimi ma zosta ona uruchomiona, np.:
dodawanie 12 69
Podobnie jak w przypadku parametrw skryptu przekazywanych w linii polece bezporednio
po nazwie pliku zawierajcego kod skryptu, tak i w przypadku funkcji, parametry funkcji
umieszczane s w tablicy $*, a odwoywanie si do poszczeglnych parametrw odbywa si
poprzez konstrukcj $1, $2, $3 itd, jednake parametry te, na czas dziaania funkcji,
zastpuj parametry skryptu przekazane w linii polece. Po zakoczeniu dziaania funkcji
mona wykonywa dziaania na parametrach skryptu, poniewa warto tych parametrw nie
ulega zmianie.
Wewntrz funkcji mona oczywicie uywa wszystkich konstrukcji, ktre zostay omwione
w niniejszym kursie.
Przykadowy skrypt zawierajcy funkcje wyglda nastpujco:
#!/bin/bash
dzielenie_liczb()
{
WYNIK=`expr $1 / $2`
echo wynik dzielenia wykonanego przez funkcje wynosi: $WYNIK
}
WYNIK=`expr $1 / $2`
echo wynik dzielenia wykonanego poza funkcja (przed jej wykonaniem) wynosi $WYNIK
dzielenie_liczb 10 5 #wywoanie funkcji wraz z parametrami
WYNIK=`expr $1 / $2`
echo wynik dzielenia wykonanego poza funkcja (po jej wykonaniu) wynosi $WYNIK
Przykadowe wywoanie powyszego skryptu wyglda nastpujco:
./nazwa_skryptu 20 4