2006 10 Skrypty powłoki w systemie Linux [Poczatkujacy]


dla początkujących
BASH
Skrypty powłoki
w systemie Linux
Aukasz Sosna
Wykonywanie codziennych czynności w systemie operacyjnym jest męczące, gdy za każdym razem
trzeba wpisywać te same zestawy komend. Znacznie wygodniej byłoby zapisać je w plikach, które
możemy pózniej uruchomić w dowolnej chwili. Pod Linuksem, dzięki możliwości tworzenia skryptów
powłoki (shella) wykonamy te zadania bez problemu; co więcej, znajomość shella bywa konieczna,
gdyż opiera się na nim duża część konfiguracji systemu....
krypty powłoki (shella) to ciągi jego instruk- Natomiast ten jest nieprawidłowy, gdyż linia została zła-
cji zapisane w postaci zwykłych plików teksto- mana w nieodpowiednim miejscu:
wych, które mogą zostać uruchomione w po-
Swłoce i wykonać za nas określone operacje. Taki #!/bin/bash
skrypt może też zawierać instrukcje warunkowe, pozwa- vdir
lające m.in. przeprowadzić wybrane działanie po wpisa- /home
niu odpowiedniego parametru w linii poleceń (po nazwie
skryptu), pętle wykonujące zapisane przez nas instrukcje Pierwsza linia każdego skryptu musi zawierać wywołanie
określoną ilość razy czy wspomniane już argumenty po- shella, pod którym skrypt będzie wykonywany. Najpopu-
dawane w linii poleceń, które przekształcimy na zmienne, larniejszą powłoką dla systemu Linux jest bash, znajdujący
którymi z kolei będzie można dowolnie manipulować. się najczęściej w katalogu z plikami binarnymi (/bin).
Ponieważ powłoka traktuje skrypty jako zwykłe ko- W podanych przykładach przedstawiliśmy zawartość tej
mendy, po każdym zapisanym w skrypcie poleceniu musi linii dla basha (#!/bin/bash). Pamiętajmy, że niezależnie
być znak nowej linii: w przeciwnym razie skrypt zakończy od typu shella, linia ta zaczyna się zawsze od znaku  # .
się niepowodzeniem. Ta sama zasada dotyczy instrukcji Aby skrypt wykonywał się na naszym komputerze,
warunkowych, pętli, itd, które wstawiamy do pliku. Po- trzeba mu nadać odpowiednie uprawnienia. Ustawiamy
między instrukcją, a otaczającymi ją znakami bądz zmien- je za pomocą polecenia chmod i muszą one mieć wartość 7
nymi powinien też zostać zachowany odpowiedni odstęp. dla osoby, która będzie wykonywała skrypt (owner, group
Przykładowo, ten skrypt będzie zapisany prawidłowo: lub other). W naszych przykładach ustawimy te prawa na
7 dla wszystkich użytkowników, więc każdy będzie mógł
#!/bin/bash je uruchamiać; pamiętajmy jednak, że nie zawsze jest to
vdir /home zalecane; czasem ze względów bezpieczeństwa warto wy-
64 pazdziernik 2006
autorzy@lpmagazine.org
dla początkujących
BASH
W innym wypadku nazwa zmiennej będzie po-
traktowana jako zwykły tekst i po prostu wy-
Parametry polecenia echo
świetlona:
Oto parametry polecenia echo, które nale- " \c wypisuje znak nowego wiersza na
ży podawać (w linii poleceń lub skrypcie) końcu linii,
#!/bin/bash
przed tekstem do wypisania: " \r powoduje powrót karetki do począt-
zmienna="tekst"
ku wiersza po wypisaniu odpowiednie-
echo zmienna
" -n na końcu linii nie będzie wypisywany
go fragmentu tekstu,
znak przejścia do nowej linii, więc tekst
" \t powoduje pokazanie się znaku tabu-
Wypisywanie tekstu na ekranie
wypisany przez kilka kolejnych echo zo-
lacji w poziomie,
Do wyświetlania tekstu na ekranie służy kil-
stanie wyświetlony  ciurkiem ,
" \v powoduje pokazanie się znaku tabu-
ka poleceń powłoki, z których najczęściej uży-
" -e pozwala zinterpretować wszystkie
lacji w pionie,
wamy echo:
znaki specjalne, które wpisujemy, po-
" \ powoduje pokazanie się znaku back-
przedzając je znakiem backslash  \ ,
slasha (\). Używamy dwóch backslashy
#!/bin/bash
" -E powoduje, że w wyświetlanym tek-
(\), aby wypisać jeden, gdyż normalnie
echo To jest tekst
ście nie będą interpretowane znaki spe-
jest on znakiem sterującym,
cjalne. Zostaną one pominięte, a powło-
" \' wypisuje znak pojedynczego apo-
Po wywołaniu skryptu ujrzymy napis To jest
ka wyświetli jedynie ich symbole,
strofu (analogicznie jak w przypadku
tekst.
" \a spowoduje pojawienie się alarmu
backslashy: apostrof jest z kolei ogra-
dzwiękowego na naszym komputerze
nicznikiem tekstu w zmiennych),
Wartości logiczne
(głośniczek),
" \ pozwala wypisać podwójny cudzy-
Tak, jak w każdym innym języku programo-
" \b po wyświetleniu tekstu cofa kursor
słów (analogicznie jak w przypadku apo-
wania, w bashu występują wartości logiczne:
(pozycję końca tekstu) o jeden znak w le-
strofów),
TRUE (prawda) i FALSE (fałsz). Są one reprezen-
wo,
" \nnn pozwala na wypisanie znaku z ta-
towane za pomocą cyfr (0 - prawda i 1 (lub ja-
" \n powoduje pojawienie się nowego
beli kodów ASCII o ósemkowej notacji
kakolwiek inna niż 0)  fałsz). Są one zwracane
wiersza po zakończeniu wypisywania
(gdzie nnn to kod znaku),
przez różne polecenia i umieszczane w specjal-
bieżącego,
nej zmiennej $? :
łączyć uprawnienia np. dla użytkowników Zamiast wpisywać nazwę powłoki, może-
oznaczonych jako other. Oto przykładowe my też użyć znaku kropki: wywołana zo- #!/bin/bash
wywołanie chmod: chmod 777 skrypt. stanie powłoka, w której aktualnie jesteśmy: vdir /home/lukasz
Nasz skrypt zapiszemy w pliku o nazwie [lukasz@ localhost ~]$ . skrypt. echo $?
skrypt. Aby go wywołać, nie wystarczy wpisać My będziemy korzystali z pierwszej me-
jego nazwy nawet będąc w tym samym kata- tody, gdyż jest ona najbardziej przystępna Skrypt spróbuje wylistować katalog (może
logu, gdyż powłoka będzie szukała polecenia i najczęściej używana przez programistów się to nie powieść, jeśli nie mamy odpowied-
o tej nazwie w ścieżce PATH i jeżeli go nie znaj- w środowisku Linux. nich uprawnień dostępu) i pokaże informacje
dzie, zwróci błąd. Musimy podać pełną ścież- o tym, czy udało się to wykonać:
kę dostępu do skryptu, zaczynającą się od / Zmienne
 jeżeli jesteśmy w tym samym katalogu, wpi- Zmienne to oznaczone nazwami miejsca [lukasz@localhost ~]$ ./skrypt
sujemy ./skrypt: w pamięci przechowujące pewne warto- drwx------ 5 lukasz lukasz 4096 gru
ści, które do nich przypiszemy. W powło- 29 19:50 Desktop
[lukasz@localhost ~]$ ./skrypt ce istnieją zmienne mogące przechowywać drwxrwxr-x 2 lukasz lukasz 4096 lis
wartości logiczne, tekst i liczby. Zmien- 24 2005 Dokumenty
Inną możliwością uruchomienia skryptu jest ne w bashu deklarujemy na bieżąco, przy- 0
wywołanie powłoki i wpisanie pliku ze skryp- pisując wartości za pomocą znaku  = :
tem jako jej argumentu: bash skrypt zmienna="tekst". Jeżeli chcemy przypisać Listing 2. Blok instrukcji warunkowej if
do zmiennej wartość zawierającą spacje, na- z użyciem elif i else
Listing 1. Blok instrukcji warunkowej if leży ją umieścić w cudzysłowach (warto to
#!/bin/bash
z użyciem else robić niezależnie od tego, czy tekst zawie-
a = 3
ra spacje, bo zapobiega to wielu potencjal-
#!/bin/bash if [  $a = 3 ]
nym błędom)  inaczej mogą wystąpić błę-
a = 3 then
dy. Przy deklarowaniu nie poprzedzamy
if [  $a = 3 ] echo Wartosc zmiennej a wynosi 3
zmiennej żadnym znakiem specjalnym.
then elif [  $a = 4 ]
Jeżeli chcemy wyświetlić zawartość zmien-
echo Wartosc zmiennej a wynosi 3 echo Wartosc zmiennej a wynosi 4
nej, musimy poprzedzić jej nazwę znakiem do-
else else
lara  $ :
echo Wartosc zmiennej a jest echo Wartosc zmiennej a jest rozna
rozna od 3 od 3 i od 4
#!/bin/bash
fi fi
zmienna="tekst"
echo $zmienna
www.lpmagazine.org 65
dla początkujących
BASH
then
Listing 3. Przykład skryptu sprawdzającego jaką Listing 5. Pętla for wyświetlająca w kolejnych
echo Wartosci sa takie same
wartość ma zmienna liniach nazwy systemów operacyjnych
fi
#!/bin/bash #!/bin/bash
Bardzo ważne są odstępy pomiędzy nawiasa-
wartosc=1 for system in Linux Windows MacOS
mi kwadratowymi a instrukcją if i wyraże-
case "$wartosc" in do
niem. Pamiętajmy też o konieczności ich za-
1) echo $system
chowania z lewej i prawej strony znaku =. Nie-
echo Liczba ma wartosc 1 done
stety, bash jest pod tym względem bardzo wy-
;;
magający (możnaby powiedzieć, że sztywny
2)
i nieprzyjazny) i niestosowanie się do tych za- Użycie gwiazdki (*) pozwala nam uwzględ-
echo Liczba ma wartosc 2
sad może zaowocować błędami. Pomiędzy nić wartości niewymienione w kolejnych wa-
;;
blokiem kodu wykonywanym przy spełnio- runkach (u nas np. 67).
*)
nym wyrażeniu a słowem fi można wstawić
echo Liczba ma inna wartosc
instrukcję else: zamieszczony w jej ramach Pętla while
;;
blok kodu zostanie wykonany przy niespeł- Pętla while służy do powtarzania czynno-
Esac
nieniu wyrażenia podanego przy if. Oczywi- ści w niej zawartych, a jej struktura jest na-
ście, sprawdzanie wyrażeń typu 1 = 1 nie ma stępująca:
Polecenie test żadnego sensu  lepiej jest użyć zmiennych czy
Polecenie test służy do testowania wyrażeń nazw plików, stosując te same operatory, co While polecenie
logicznych, czyli porównywania wartości. w poleceniu test. Spójrzmy na Listing 1: spraw- do
Ma ono wiele możliwości, np. pozwala dzamy, czy zmienna a jest równa 3. W wyraże- blok czynności do wykonania
sprawdzić, czy a jest mniejsze od b, czy wy- niu używamy nazwy zmiennej poprzedzo- done
brany plik jest katalogiem lub czy łańcuch nej znakiem $. Co więcej, otaczamy ją cudzy-
tekstowy ma długość większą od 0. Na przy- słowem, co zapobiega wielu przykrym niespo- Czynności zapisane w bloku kodu pomiędzy
kład efektem działania skryptu: dziankom związanym ze specyficznym trakto- słowami do i done będą powtarzane (iterowa-
waniem zmiennych przez basha. ne) tak długo, aż warunek postawiony pętli nie
#!/bin/bash Nic nie stoi na przeszkodzie, aby w jednym zostanie spełniony. Spójrzmy na Listing 4: zde-
test 2 -gt 3 bloku if zawrzeć więcej warunków: służy do finiowana na nim zmienna i ma początkową
echo $? tego słowo elif (Listing 2), które pozwala do- wartość 0. Następnie wartość ta jest wyświetla-
dawać kolejne wyrażenia (u nas: czy a jest równe na w pętli while instrukcją echo i zwiększana
Będzie sprawdzenie, czy 2 jest większe (-gt 4?). Blok zapisany pod else zostanie wykonany (inkrementowana) o 1 z każdym przebiegiem
od ang. greater) od 3 i zwrócenie wyniku, któ- jedynie wtedy, gdy żadne z wymienionych pętli. Zawarte w nagłówku while wyrażenie
ry oczywiście jest fałszywy (1) i który wyświe- wyrażeń nie będzie spełnione (u nas: gdy a jest [ $i -lt 5 ] powoduje, że instrukcje w pętli
tlimy używając echo $?. Większą listę para- różne zarówno od 3, jak i od 4). będą wykonywane, aż zmienna i osiągnie
metrów test zamieszczamy w Ramce Parame- wartość 5.
try polecenia test. Instrukcja case
Instrukcja case jest podobna do instrukcji Pętla for
Instrukcja if if, ale różni się od niej składnią. Nic nie stoi Pętla for, której konstrukcja jest inna niż whi-
If to podstawowa instrukcja warunkowa na przeszkodzie, aby używać obu instrukcji le, powtórzy czynności zapisane w bloku po-
w bashu: testuje podane przy słowie if wy- zamiennie (if zamiast case i vice versa). Oto między do a done wobec każdego elementu li-
rażenie i jeżeli ono jest prawdziwe, wykonuje składnia case: sty, którą jej podstawimy (może być nią też np.
blok kodu zawarty pomiędzy then a fi (fi jest tablica albo katalog na dysku). Jej konstrukcja
zakończeniem całego bloku if). Przykład: case warunek in jest następująca:
odpoweidz1)
#!/bin/bash pierwszy blok kodu Listing 6. Polecenie continue nie pokazuje napi-
if [ 1 = 1 ] ;; su  kolejny system po systemie Linux
Esac
#!/bin/bash
Listing 4. Pętla while, która wyświetla liczbę
for system in Windows Linux MacOS
i zwiększa jej wartość o 1, aż do osiągnięcia 5 Spójrzmy na Listing 3, na którym zamieściliś-
do
my przykład użycia case. Jak widzimy, blok
#!/bin/bash echo $system
case zaczyna się od słowa case, a kończy na
i=0 if [ "$system" = "Linux" ]
esac. Poszczególne warunki są oznaczone
while [ $i -lt 5 ] then
prawymi nawiasami okrągłymi (np. 1), 2))
do continue
i oddzielone od siebie podwójnymi znakami
echo $i fi
średnika (;;). Przy słowie case wymieniamy
i=`expr $i + 1` echo kolejny system
zmienną (ponownie ze znakiem $ na początku
done done
i otoczoną cudzysłowami), której wartość bę-
dziemy sprawdzali oraz słowo kluczowe in.
66 pazdziernik 2006
dla początkujących
BASH
For zmienna in lista
do
Parametry polecenia test
blok_kodu_do_wykonania
done Polecenie test wykorzystuje parametry odstępy o długości jednej spacji z każ-
i operatory pozwalające wykonywać za- dej strony,
Spójrzmy na Listing 5. Przedstawiona tam pę- awansowane porównania, np.: " != sprawdza, czy ciągi znaków lub licz-
tla for przypisze zmiennej system kolejne war- by po jego końcach nie są identyczne
tości. Każdą z nich wypiszemy używając echo, " -d sprawdza, czy plik jest katalogiem (analogicznie jak =)
uzyskując tym samym listę popularnych syste- (test -d nazwa_pliku) " -z sprawdza, czy ciąg znaków podany
mów operacyjnych (każda nazwa w osobnej li- " -f sprawdza, czy plik ma prawa do wy- po nim ma zerową długość (test -z
nijce). Możemy też używać innej składni pętli konywania (test -f nazwa_pliku) ciąg_znaków)
for, przypominającej tę z języka C/C++: " -L informuje, czy plik jest dowiązaniem " -n sprawdza, czy ciąg podany za nim
symbolicznym do innego miejsca (test ma niezerową długość (analogicznie
for ((wyrażenie1; wyrażenie2; -L nazwa_pliku) jak -n)
wyrażenie3)) " -r sprawdza, czy plik istnieje i czy są " -eq sprawdza, czy wartości liczbowe
mu nadane prawa do odczytu (test -r (wyłącznie one) podane po jego obu
Przykładowo: nazwa_pliku) stronach są sobie równe (test war-
" -w sprawdza, czy plik istnieje i są mu tość1 -eq wartość2)
for ((licznik=5; licznik <= 23; nadane prawa zapisu (test -w na- " -ne sprawdza, czy wartości liczbowe po-
licznik++)) zwa_pliku) dane po jego obu stronach nie są iden-
do " -x sprawdza, czy plik istnieje i czy są tyczne (analogicznie jak -eq)
echo wartosc zmiennej licznik: mu nadane prawa do jego uruchomie- " -gt sprawdza, czy pierwsza wartość
$licznik nia (test -x nazwa_pliku) liczbowa jest większa od drugiej (test
done " -s sprawdza, czy plik istnieje i czy jego liczba1 -gt liczba2)
wartość nie jest zerowa (test -s na- " -ge sprawdza, czy pierwsza wartość
W tym przypadku, w pierwszym przebiegu zwa_pliku) liczbowa jest większa lub równa drugiej
pętli for zmiennej licznik zostanie przy- " -nt porównuje daty zapisu i sprawdza, (test liczba1 -ge liczba2)
pisana wartość 5, która będzie wzrastać czy czy plik1 jest nowszy (ang. newer " -lt sprawdza, czy pierwsza wartość
z każdym kolejnym przebiegiem (decyduje than) od plik2 (test plik1 -nt plik2) liczbowa jest mniejsza od drugiej (test
o tym wyrażenie3, w naszym przypadku " -ot sprawdza, czy plik1 jest starszy liczba1 -lt liczba2)
licznik++), aż osiągnie wartość 23. (ang. older than) od plik2 (test plik1 " -le sprawdza, czy pierwsza wartość
-ot plik2) liczbowa jest mniejsza lub równa drugiej
Instrukcje continue i break " = sprawdza, czy ciągi znaków, zmien- (test liczba1 -le liczba2)
Polecenie continue wymusza przejście do na- ne bądz liczby są identyczne, czyli rów- " Wykrzyknik (!) to znak przecze-
stępnego kroku w pętli (iteracji). Polecenia te- ne sobie (test liczba1 = liczba2). nia: stosujemy go, gdy chcemy uzy-
go używamy z warunkiem, po którym ma się UWAGA: pomiędzy porównywanymi skać wynik odwrotny do wyniku tekstu
ono wykonać, gdyż inaczej pętla się w ogóle wartościami a znakiem  = muszą być (TRUE zamiast FALSE lub vice versa)
nie wykona. Spójrzmy na Listing 6. Po natra-
fieniu na nazwę Linux, pętla for przeskoczy trafieniu na nazwę Linux, pętla for zakończy Podsumowanie
do następnego elementu, więc nie ujrzymy na- swoje działanie. W tym artykule przedstawiliśmy podsta-
pisu kolejny system. Polecenie break może za- we możliwości tworzenia skryptów powło-
kończyć działanie dowolnej pętli, jeżeli poda- Argumenty z linii poleceń ki, które pomogą Ci zacząć przygodę z ba-
my warunek jej zakończenia, np. liczbę po- Jak już wiemy, do skryptu bashowego może- shem. Na omówienie wszystkich aspektów
wtórzeń dla pętli. Przykład użycia break za- my przekazać argumenty, które umieszcza- tego shella nie wystarczyłoby miejsca nawet,
mieściliśmy na Listingu 7: tym razem, po na- my za nazwą pliku ze skryptem (w linii po- gdyby zajmował on cały magazyn Linux+.
leceń albo innym skrypcie, gdyż możliwe jest Dodajmy, że skrypty bashowe są nie tylko
Listing 7. W tym skrypcie polecenie break koń- wywoływanie jednych skryptów z drugich). przydatne w automatyzowaniu powtarzal-
czy działanie pętli po natrafieniu na słowo Linux Przykład: ./ulubiony_system super. nych czynności (np. montowania i odmon-
Do przekazanych wartości odwołujemy towywania dysków, kasowania pamięci ca-
#!/bin/bash
się za pomocą specjalnych zmiennych numer- che przeglądarek internetowych czy porząd-
for system in FreeBSD Linux Windows
cznych oznaczanych jako $1, $2, $3, itd. W na- kowania plików tymczasowych), ale rów-
do
szym przykładzie, wartością $1 będzie super. nież są wykorzystywane w instalacji i kon-
echo $system
Oto skrypt ulubiony_system: figuracji systemu Linux i jego elementów
if [ "$system" = "Linux" ]
(np. sieci). Warto się więc ich nauczyć, do
then
#!/bin/bash czego potrzebna jest długotrwała prakty-
break
echo "System Linux jest $1 ka: znając basha wykonasz każdą czynność
fi
w Linuksie i cały system będzie pod Two-
done
W efekcie działania skryptu uzyskamy napis: ją komendą.
System Linux jest super.
68 pazdziernik 2006


Wyszukiwarka

Podobne podstrony:
09 Linux Skrypty powłoki część II
2006 10 Tv in Linux Building a Home Media Center with Mythtv
TEST z podstaw systemu LINUX
przyklady instalacji kilku systemow linux 5
Bootowalny pendrive z systemem Linux
10 Engine Control System
2006 10 Idle Cycles Building Distributed Applications with Boinc
10 skrypty
3 Systemy Operacyjne 19 10 2010 Klasyfikacja Systemów Operacyjnych2
Dynamiczny przydział pasma użytkownika sieci z wykorzystaniem usługi QoS w systemie Linux

więcej podobnych podstron