Kurs pisania skrypt+-w w pow+éoce BASH.pdf

(93 KB) Pobierz
Microsoft Word - Bash.doc
KurspisaniaskryptówwpowłoceBASH
Skryptshellowytonicinnegojakbardziejrozbudowanawersjalistypewnychpoleceń,które
mają zostać wykonane przez system. Zgodnie z ogólnie przyjętą konwencją, każdy
powstającyskrypt(działającywBASHu)powiniensięzaczynaćodnastępującejlinijki:
#!/bin/bash
Linia ta jest o tyle istotnie, że przy jej pomocy definiujemy powłokę, która będzie
odpowiedzialnazawykonanieciąguinstrukcjiumieszczonychwewnątrzskryptu.
Pomimo tego, że pominiecie tej linii spowoduje, że skrypt będzie działał, zaleca się jej
stosowanie, ponieważ składnia rozmaitych powłok może się nieznacznie różnić, a w
rezultacieuruchomiony skryptmożewyświetlać różnewyniki(będzierazdziałać,araznie)
wzależnościodtego,podjakąpowłokązostanieuruchomiony.
Wstęp
Jak to zazwyczaj bywa podczas nauki pisania programów, pierwszym wykonanym
programemprzezosobępragnącązgłębićtajnikidanegojeżykaprogramowaniajestprogram
wyświetlający krótki tekst na monitorze. Aby nie odstępować od tych „powszechnie
przyjętychnorm”,takżewBashupierwszymskryptem,któryzostanienapisanywtymkursie
będzieskrypt,którywyświetlinaekraniemonitorakróciutkitekst.
Skrypt,którytowykonajestniezwykleprostyiskładasięzdwóchlinijekkodu:
#!/bin/bash
echo”Mojpierwszyskrypt”
Uruchomienietegoskryptuspowodujewyświetlenienaekraniemonitorakomunikatuotreści:
Mojpierwszyskrypt
a następnie przejście do następnej linii (aby pozostać w tej samej linii należałoby po słowie
echowstawićparametr–ncowyglądałobytak:echo–n”Mójpierwszyskrypt”).
Jak się można łatwo domyśleć polecenie echo odpowiada za wyświetlenie tekstu na ekranie
monitora.
Bardzo często stosowaną praktyką wśród programistów jest komentowanie poszczególnych
liniipowstającegokodu.TakżeiwBASHujesttomożliwe,adokonujesiętegoprzyużyciu
znaku#cowrezultaciewyglądanastępująco:
#!/bin/bash
echo”Mojpierwszyskrypt”#wyświetlenietekstunamonitorze
Pewnie dla większości osób czytających ten tekst, a które miały już wcześniej styczność z
programowaniem(chociażbywPascalu)odrazurzucasięwoczy,żeciąginstrukcjiniejest
zakończony znakiem średnika, a same źródło skryptu nie znajduje się pomiędzy słowami
kluczowymi begin i end. Są to jedne z wielu różnic, które występują pomiędzy „zwykłym
programowaniem”,apisaniemskryptówpowłoceBASH.
Pierwszyskrypt.
1.
2.
UWAGA
Pozapisaniuskryptudoplikunależypamiętaćonadaniutemuplikowiodpowiednichprawdo
jegowykonywaniawprzeciwnymprzypadkuskryptniezadziała.
3.
Zmienne.
W każdym języku programowania potrzebne są zmienne, aby przy ich pomocy wykonać
pewne operacje. Także w skryptach bashaa można używać zmiennych, a definiuje się je w
następującysposób:
ZMIENNA=witam#jeżeliwwartościzmiennejniemaspacjinietrzebaużywaćznaku
cudzysłowie
lub
ZMIENNA=12345#jeżeliprzypisujemyliczbylubcyfrynieużywamyznakucudzysłowie
lub
ZMIENNA=”witamwas”#jeżeliwwartościzmiennejznajdujesięznakspacji,towartośćtą
trzeba umieścić w cudzysłowie w przeciwnym wypadku będzie to zinterpretowane jako
błędnyzapis.
Zmiennemożnazadeklarowaćwdowolnymdlaprogramistymomencie,aponadtonietrzeba
nadawać im odpowiedniego typu tak jak to ma miejsce w innych językach programowania
(np. pascal, c , c++ ). Podczas deklarowania zmiennych i przypisywania im pewnych wartości
należy zwrócić uwagę na jedną bardzo istotną rzecz, a mianowicie po obu stronach znaku =
(który służy do przypisania wartości do zmiennej) nie mogą znajdować się spacje ponieważ
spowoduje to powstanie błędu.
ZMIENNA = witam #błędny zapis !!!
Powyższy zapis jest błędny, ponieważ shell interpretuje linię poleceń jako komendę i jej
argumenty, które są rozdzielone znakiem spacji, zatem zapis ZMIENNA = witaj zostanie
zinterpretowany w ten sposób, że słowo ZMIENNA będzie uważane za polecenie, natomiast
znak ‘=‘ i słowo ‘witaj’ będą uważane za parametry do tego polecenia. Zapis
ZMIENNA=witaj zostanie zinterpretowane jako polecenie, co jest jak najbardziej poprawne.
Kolejną istotną rzeczą, o której należy wspomnieć przy omawianiu zmiennych, jest fakt, że
ich nazwy pisze się dużymi literami (oczywiście jak ktoś nazwę zmiennej napisze małymi
literami to się nic nie stanie i skrypt będzie działał poprawnie, ale przy programowaniu
skryptów przyjęło się, że nazwy zmiennych są pisane dużymi literami).
Bardzo istotny jest również fakt, że BASH rozróżnia duże i małe litery, zatem odwoływanie
się do zmiennej odbywa się przez użycie dokładnie takiej samej nazwy zmiennej przy
pomocy jakiej ta zmienna została zadeklarowana (jeżeli nazwa zadeklarowanej zmiennej jest
napisana dużymi literami, a odwołanie do niej odbywa się poprzez podanie jej nazwy z
małych liter to oczywiście odwołanie to nie przyniesie oczekiwanego rezultatu, ponieważ taka
zmienna nie istnieje).
Odwołanie się do wartości zadeklarowanej wcześniej zmiennej odbywa się w następujący
sposób:
ZMIENNA=witaj #deklaracja zmiennej
$ZMIENNA #odwołanie się do zmiennej w sposób prawidłowy
$zmienna #odwołanie się do zmiennej w sposób nieprawidłowy, ponieważ nazwa wcześniej
zadeklarowanej zmiennej została podana z dużych liter, a podczas odwołania się do niej jej
nazwa jest podana małymi literami, w rezultacie zostanie to zinterpretowane jako odwołanie
się do nowej zmiennej, której nazwa jest napisana małymi literami.
W Bashu podczas wyświetlania teksu na ekranie monitora można się spotkać z dwoma
konstrukcjami:
·
echo ”Mój pierwszy skrypt”
·
echo ‘Mój pierwszy skrypt’
w obu, przedstawionych powyżej przypadkach efekt będzie taki sam – na ekranie monitora
pokaże się napis:
Mój pierwszy skrypt
jednakże różnicę w tych konstrukcjach zobaczymy na przykładzie prostego skryptu:
#!bin/bash
ZMIENNA=”Mójpierwszyskrypt”
echo”$ZMIENNA”
echo‘$ZMIENNA’
Po uruchomieniu powyższego skryptu na ekranie monitora ukaże się następujący rezultat:
Mój pierwszy skrypt
$ZMIENNA
zatem zasada jest bardzo prosta: wewnątrz cudzysłowie nazwy zmiennych które są
poprzedzone znakiem $ są zastępowane przez przypisaną im wartość, natomiast wewnątrz
apostrofów nie.
Niekiedy zachodzi potrzeba, aby nazwy zmiennych ująć w cudzysłowy. Jest to istotne, gdy
wartość zmiennej zawiera spacje lub jest pustym ciągiem. Aby to zobrazować należy
prześledzić działanie następującego skryptu:
#!bin/bash
ZMIENNA=””
if[n$ZMIENNA];then#nsprawdzaczyargumentniejestpusty
echo”ZmiennaonazwieZMIENNAniejestpusta”;
else
echo”ZmiennaonazwieZMIENNAjestpusta”;
fi
Uruchomienie powyższego 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 ciąg pusty co nie jest argumentem, zatem jeżeli nie ma argumentu to skrypt zwraca
prawdę.
Aby skrypt działał poprawnie to musiałby wyglądać w następujący sposób:
#!bin/bash
ZMIENNA=””
if[n”$ZMIENNA”];then
echo”ZmiennaonazwieZMIENNAniejestpusta”
else
echo”ZmiennaonazwieZMIENNAjestpusta”
fi
W rezultacie na ekranie monitora wyświetli się wynik:
Zmienna o nazwie ZMIENNA jest pusta.
Będzie się tak działo ponieważ shell zinterpretuje warunek w następujący sposób: [ -n ””]
(wcześniej interpretacja wyglądała tak [ -n ]).
Podoba sytuacja jest w następującym przypadku:
ZMIENNA=”Alamakota”
if[n$ZMIENNA];then
Shell zinterpretuje warunek jako [ -n Ala ma kota ] co jest zapisem błędnym. Aby zapis był
poprawny należy go wykonać w następujący sposób
ZMIENNA=”Alamakota”
if[n”$ZMIENNA”];then
W tym przypadku shell zinterpretuje warunek jako: [ -n ”Ala ma kota” ] co jest zapisem
poprawnym.
Mówiąc o zmiennych należy rozważyć jeszcze jeden przypadek, a mianowicie jak wypisać na
ekranie monitora wartość danej zmiennej, a bezpośrednio za tą wartością (bez znaku spacji)
wyświetlić jakiś tekst, np. wyświetlić wartość ZMIENNA, a bezpośrednio za tą wartością
słowo ‘stopni’. Sprawa może wydaje się prosta i na pierwszy rzut oka pewnie większość osób
napisałaby taki skrypt w następujący sposób:
#!/bin/bash
ZMIENNA=49
echo”$ZMIENNAstopni”
Niestety po uruchomieniu powyższego skryptu ekran monitora pozostanie pusty. Dlaczego ?
ano dlatego, że shell zinterpretował ten skrypt jako próbę wyświetlenia wartości zmiennej o
nazwie ZMIENNAstopni, która przecież nie została zadeklarowana czyli nie istnieje. Aby
skrypt dał poprawny rezultat to nazwę zmiennej trzeba oddzielić od tekstu nawiasami
klamrowymi {}. Poprawny skrypt powinien więc wyglądać następująco:
#!/bin/bash
ZMIENNA=49
echo”${ZMIENNA}stopni”
Po jego wywołaniu na ekranie monitora pojawi się napis:
49stopni
Przy pomocy zmiennych możemy również wywoływać polecenia linux’a. Dzieje się tak
dlatego, że shell rozwija zmienne. Aby to zrozumieć należy prześledzić działanie poniższego
skryptu.
#!/bin/bash
Z1=”ls”
Z2=”l”
$Z1$Z2
Wywołanie tego skryptu spowoduje wykonanie przez shella następującego polecenia:
ls –l
Do tej pory nie został jeszcze omówiony sposób przekazywania do zmiennej wartości, która
została wprowadzone przez użytkownika przy pomocy klawiatury. Aby tego dokonać należy
użyć polecenia read, a jego działanie ilustruje poniższy skrypt:
#!/bin/bash
echo”Podajswojeimie:”
readIMIE
echo”Naimiemasz:$IMIE”
Powyższy skrypt działa następująco: na ekranie monitora pojawi się napis o treści ‘Podaj
swoje imie:’ po czym skrypt będzie oczekiwał aż użytkownik wpisze z klawiatury swoje imię
(np. Krzysiek) i przyciśnie klawisz ENTER, a następnie na ekranie monitora pojawi się napis
o treści ‘Na imie masz: Krzysiek’ co zakończy działanie uruchomionego skryptu.
Na zmiennych można wykonywać również proste operacje matematyczne. Odbywa się to w
następujący sposób:
#!/bin/bash
echo”Podajpierwszaliczbe:”
readL1
echo”Podajdrugaliczbe:”
readL2
SUMA=$(($L1+$L2))
Zgłoś jeśli naruszono regulamin