You are on page 1of 15

Kurs pisania skryptw w powoce BASH

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).

Odwoanie si do wartoci zadeklarowanej wczeniej zmiennej odbywa si w nastpujcy


sposb:
ZMIENNA=witaj #deklaracja zmiennej
$ZMIENNA #odwoanie si do zmiennej w sposb prawidowy
$zmienna #odwoanie si do zmiennej w sposb nieprawidowy, poniewa nazwa wczeniej
zadeklarowanej zmiennej zostaa podana z duych liter, a podczas odwoania si do niej jej
nazwa jest podana maymi literami, w rezultacie zostanie to zinterpretowane jako odwoanie
si do nowej zmiennej, ktrej nazwa jest napisana maymi literami.
W Bashu podczas wywietlania teksu na ekranie monitora mona si spotka z dwoma
konstrukcjami:

echo Mj pierwszy skrypt


echo Mj pierwszy skrypt

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

Uruchomienie powyszego skryptu spowoduje, e na ekranie monitora pojawi si napis:


Zmienna o nazwie ZMIENNA nie jest pusta
Zdziwieni ? Dzieje si tak dlatego, e shell zamieni $ZMIENNA na warto zmiennej czyli
na cig pusty co nie jest argumentem, zatem jeeli nie ma argumentu to skrypt zwraca
prawd.
Aby skrypt dziaa poprawnie to musiaby wyglda w nastpujcy sposb:
#!bin/bash
ZMIENNA=
if [ -n $ZMIENNA ]; then
echo Zmienna o nazwie ZMIENNA nie jest pusta
else
echo Zmienna o nazwie ZMIENNA jest pusta
fi
W rezultacie na ekranie monitora wywietli si wynik:
Zmienna o nazwie ZMIENNA jest pusta.
Bdzie si tak dziao poniewa shell zinterpretuje warunek w nastpujcy sposb: [ -n ]
(wczeniej interpretacja wygldaa tak [ -n ]).
Podoba sytuacja jest w nastpujcym przypadku:
ZMIENNA=Ala ma kota
if [ -n $ZMIENNA ]; then

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

Niestety po uruchomieniu powyszego skryptu ekran monitora pozostanie pusty. Dlaczego ?


ano dlatego, e shell zinterpretowa ten skrypt jako prb wywietlenia wartoci zmiennej o
nazwie ZMIENNAstopni, ktra przecie nie zostaa zadeklarowana czyli nie istnieje. Aby
skrypt da poprawny rezultat to nazw zmiennej trzeba oddzieli od tekstu nawiasami
klamrowymi {}. Poprawny skrypt powinien wic wyglda nastpujco:
#!/bin/bash
ZMIENNA=49
echo ${ZMIENNA}stopni
Po jego wywoaniu na ekranie monitora pojawi si napis:
49stopni
Przy pomocy zmiennych moemy rwnie wywoywa polecenia linuxa. Dzieje si tak
dlatego, e shell rozwija zmienne. Aby to zrozumie naley przeledzi dziaanie poniszego
skryptu.
#!/bin/bash
Z1=ls
Z2=-l
$Z1 $Z2
Wywoanie tego skryptu spowoduje wykonanie przez shella nastpujcego polecenia:
ls l
Do tej pory nie zosta jeszcze omwiony sposb przekazywania do zmiennej wartoci, ktra
zostaa wprowadzone przez uytkownika przy pomocy klawiatury. Aby tego dokona naley
uy polecenia read, a jego dziaanie ilustruje poniszy skrypt:
#!/bin/bash
echo Podaj swoje imie:
read IMIE
echo Na imie masz: $IMIE
Powyszy skrypt dziaa nastpujco: na ekranie monitora pojawi si napis o treci Podaj
swoje imie: po czym skrypt bdzie oczekiwa a uytkownik wpisze z klawiatury swoje imi
(np. Krzysiek) i przycinie klawisz ENTER, a nastpnie na ekranie monitora pojawi si napis
o treci Na imie masz: Krzysiek co zakoczy dziaanie uruchomionego skryptu.
Na zmiennych mona wykonywa rwnie proste operacje matematyczne. Odbywa si to w
nastpujcy sposb:
#!/bin/bash
echo Podaj pierwsza liczbe:
read L1
echo Podaj druga liczbe:
read L2
SUMA=$(($L1 + $L2))

echo wynik dodawania wynosi: $SUMA


4. Parametry.
Do wywoywanego skryptu mona przekazywa parametry jego wywoania. Parametrw
mona uywa dokadnie tak samo jak zmiennych jednake nie mona zmieni ich wartoci.
Kady z parametrw wywoania posiada swj numer, dziki czemu programista w bardzo
prosty sposb moe odwoa si do kadego z nich. Odwoanie si w treci skryptu do
parametrw odbywa si w nastpujcy sposb:
S* - wszystkie parametry poczwszy od parametru numer 1
$0 nazwa programu
$1 parametr nr 1

$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)

./nazwa_skryptu pitek - wywietlenie tekstu weekend jest ju tuz tuz,


./nazwa_skryptu sobota - wywietlenie teksu ju weekend
./nazwa_skryptu niedziela - wywietlenie teksu weekend si ju powoli konczy
./nazwa_skryptu poniedzialek - wywietlenie teksu ju poniedziaek znowu trzeba isc
do pracy
e) ./nazwa_skryptu <jakikolwiek inny dzie tygodnia> - wywietlenie teksu srodek
tygodnia trzeba ciezko pracowac
6. Instrukcja warunkowa IF.
W instrukcji warunkowej if wyrnia si trzy zasadnicze skadnie tego polecenia:
a) w przypadku, gdy zachodzi potrzeba sprawdzenia jakiego warunku np. czy dwie
liczby s rwne skadnia wyglda nastpujco:
if warunek; then
wyraenie1;
wyraenie2;
fi

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

i jest zwykym plikiem


9. Ptle.
Jak wiadomo ptle stosuje si w celu wykonania pewnych instrukcji dla kolejnych iteracji lub
kilku parametrw. W bashu przy tworzeniu skryptw rwnie moemy si posugiwa
ptlami. Do najczciej stosowanych ptli zalicza si ptle for i while, ktre zostan
omwione.
FOR
Skadnia ptli for wyglda nastpujco:
for ZMIENNA in ; do
instrukcje;
done
Przykadem uycia ptli for moe by skrypt, ktry wywietli, linijka po linijce, wszystkie
parametry, z jakimi ten skrypt zosta uruchomiony niezalenie od liczby tych parametrw.
Kod takiego skryptu wyglda nastpujco:
#!/bin/bash
for ZMIENNA in $*; do
echo $ZMIENNA;
done
Oczywicie ptle for mona uywa na wiele rnych sposobw np.:
#!/bin/bash
DZIEN1=poniedziaek
DZIEN2=wtorek
DZIEN3=roda
for ZMIENNA in $DZIEN1 $DZIEN2 $DZIEN3; do
echo Dzisiaj jest: $ZMIENNA;
done
Jak pokazuje powyszy skrypt, ptla for wykonuje instrukcje zawarte wewntrz ptli na
parametrach, ktre s oddzielone spacjami dlatego te zaleca si umieszczanie tych
parametrw cudzysowach chyba, e parametry te nie zawieraj znaku spacji.
WHILE
Skadnia ptli while wyglda nastpujco:
while warunek; do
instrukcje;
done
W ptli while warunek zbudowany jest dokadnie tak samo jak w instrukcji warunkowej IF (ta
sama konstrukcja te same operatory).

Ptla while dziaa tak dugo dopki warunek jest prawdziwy w przeciwnym razie ptla
koczy swoje dziaanie. Do sterowania ptl while istniej dwie instrukcje:

break przerwanie wykonywania ptli


continue wymuszenie kolejnej iteracji ptli

Przykadowy skrypt wykorzystujcy ptl while moe wyglda nastpujco:


#!/bin/bash
if [ $1 gt $2 ]; then
X=$1;
while [ $X gt $2 ]; do
ROZNICA=$(($X - $2));
echo liczba $X jest wieksza od liczby $2 o $ROZNICA;
X=$(($X 1));
done
else
echo liczba $1 nie jest wieksza od liczby $2;
fi
Powyszy skrypt dziaa w nastpujcy sposb: jeeli pierwszy parametr uruchomienia skryptu
jest rwny lub mniejszy od parametru drugiego z ktrym skrypt zosta uruchomiony to na
ekranie monitora wywietli si napis liczba <warto pierwszego parametru> nie jest
wiksza od liczby <warto drugiego parametru> w przeciwnym razie na ekranie monitora
bdzie si wywietla napis liczba <warto aktualna liczby> jest wiksza od liczby <warto
drugiego parametru> o <rnica midzy liczb pierwsz a drug> po czym warto pierwszej
liczby bdzie zmniejszana o jeden. Ptla zakoczy swoje dziaanie, kiedy warunek
[ $X gt $2 ] bdzie nieprawdziwy czyli wtedy kiedy zmienna X osignie tak sam warto
jak zmienna $2.
UNTIL
Ptla until na dokadnie tak sam skadnie jak ptla while i dziaa tak samo jak ptla while z
t rnica, e warunek znajdujcy si w ptli until jest zanegowany. Ptla until dziaa tak
dugo dopki warunek jest nieprawdziwy w przeciwnym razie ptla koczy swoje dziaanie.
Zgodnie z tym skadnia ptli until wyglda nastpujco:
until warunek; do
instrukcje;
done
Przykadowy skrypt wykorzystujcy ptl while moe wyglda nastpujco:
#!/bin/bash
X=$1
until [ $X gt $2 ]; do
echo liczba $X jest mniejsza od liczby $2;
X=$(($X + 1));
Done

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.

10. Uycie znakw globalnych w ptlach


Wspominajc o ptlach, ktrych implementacj moemy stosowa w skryptach shellowych
naley rwnie wspomnie o znaku *. Ot wszystkie parametry zawierajce znak *
zastpowane s list plikw, ktre pasuj do zadanego wzorca (sam znak * jest zastpowany
list wszystkich plikw znajdujcych si w biecym katalogu za wyjtkiem plikw, ktrych
nazwa zaczyna si od kropki).
Zasad dziaania znaku * zobrazuje poniszy skrypt:
#!/bin/bash
echo Oto zawarto katalogu ${PWD}:
echo ${PWD}/*
W wyniku wykonania w/w skryptu zostan wywietlony wszystkie pliki znajdujce si w
katalogu biecym. Oczywicie istnieje rwnie moliwo wykorzystania znaku * w
zakadaniu tzw. maski:
#!/bin/bash
echo Oto wykaz wszystkich plikw z katalogu ${PWD}, ktrych nazwa zaczyna si na litere
a:
echo ${PWD}/a*
Wykonanie powyszego skryptu spowoduje wypisanie, z katalogu biecego, wszystkich
plikw, ktrych nazwa zaczyna si na liter a.
11. Podstawianie polece
Jednym z bardziej przydatnych i wygodnych mechanizmw basha jest moliwo pobierania
danych, ktre zostay otrzymane w wyniku dziaania jakiego polecenia linuxowego i
traktowanie ich tak jakby zostay wprowadzone z klawiatury. Mechanizmem tym jest
mechanizm podstawiania polece.
Istniej dwa sposoby podstawiania polece:

rozwijanie zawartoci nawiasw


ujmowanie polecenia w tzw. wsteczne apostrofy.

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.

Poniej znajduje si przykad skryptu, ktry obrazuje zasad dziaania mechanizmu


podstawiania polece:
#!/bin/bash
DANE=$(ls l)
echo Wynik metody rozwijania zawartosci nawiasow:
echo $DANE
DANE=`cat test.txt`
echo Wynik metody ujmowania polecenia w tzw. wsteczne apostrofy:
echo $DANE
12. Operacje arytmetyczne
Omawiajc problematyk pisania skryptw dziaajcych w powoce bash naley rwnie
wspomnie o moliwoci wykonywania oblicze arytmetycznych, do ktrych uywa si
operatora expr odpowiadajcego za wykonanie wszystkich operacji. Jego uycie wyglda w
nastpujcy sposb:
WYNIK_DZIALANIA=`expr 13 7` # za zmienna WYNIK_DZIALANIA zostanie
podstawiony wynik odejmowania liczby 7 od liczby 13.
Zapis operacji matematycznych:
a + b odpowiednik `expr a + b` #dodawanie
a - b odpowiednik `expr a - b` #odejmowanie
a * b odpowiednik `expr a \* b` #mnoenie
a / b odpowiednik `expr a / b` #dzielenie
a % b odpowiednik `expr a % b` #reszta z dzielenia a przez b
Przykadowy skrypt wykonujcy podstawowe dziaania matematyczne:
#!/bin/bash
A=$1
B=$2
echo n Wynik dodawania liczby $1 do liczby ${2}:
WYNIK=`expr $A +$B`
echo$WYNIK
echo n Wynik odejmowania liczby $1 od liczby ${2}:
WYNIK=`expr $B - $A`
echo$WYNIK
echo n Wynik mnozenia liczby $1 przez liczbe ${2}:
WYNIK=`expr $A \* $B`
echo$WYNIK
echo n Wynik dzielenia liczby $1 przez liczbe ${2}:
WYNIK=`expr $A / $B`
echo$WYNIK
echo n Reszta z dzielenia liczby $1 przez liczbe ${2}:
WYNIK=`expr $A % $B`
echo$WYNIK

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

W wyniku wykonania powyszego skryptu na ekranie monitora pojawi si nastpujcy wynik


jego dziaania:
wynik dzielenia wykonanego poza funkcja (przed jej wykonaniem) wynosi 5
wynik dzielenia wykonanego przez funkcje wynosi: 2
wynik dzielenia wykonanego poza funkcja (po jej wykonaniu) wynosi 5
Powyszy skrypt ma za zadanie udowodni, e parametry skryptu nie s modyfikowane w
wyniku wywoania wewntrz skryptu funkcji wraz z jej parametrami.
14. Zakoczenie
I to by byo na, tyle. W kursie tym podana zostaa podstawowa skadnia pomocna w pisaniu
prostych jak i tych bardziej skomplikowanych skryptw. Oczywicie przedstawiony materia
nie wyczerpuje w caoci poruszonego zagadnienia, a jedynie stanowi wstp do dalszej pracy
podczas tworzenia skryptw dziaajcych w powoce bash.

You might also like