Zgryźliwość kojarzy mi się z radością, która źle skończyła.
Programowanie
w języku powłoki
E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\14.DOC 255
Rozdzia³ 14. ¨ Programowanie w języku powłoki 261
Rick McMullin
W tym rozdziale:
u Tworzenie i uruchamianie programów powłoki
u Używanie zmiennych
u Cudzysłowy
u Polecenie test
u Instrukcje warunkowe
u Instrukcje iteracji
u Funkcje
Trzy poprzednie rozdziały mówiły o używaniu najpopularniejszych powłok linuxowych. Teraz przyjrzymy się wbudowanym w nie interpretowanym językom programowania.
Poniższy rozdział omawia podstawy pisania skryptów w języku powłoki, ze zwróceniem uwagi na różnice pomiędzy językami wbudowanymi w poszczególne interpretery. Poruszone zostaną następujące tematy:
u tworzenie i uruchamianie programów powłoki,
u używanie zmiennych,
u cudzysłowy,
u polecenie test,
u instrukcje warunkowe,
u instrukcje iteracji,
u funkcje.
Każde nowe polecenie przedstawione w tym rozdziale poparte jest krótkim przykładem, który ma na celu ułatwienie zrozumienia zasad jego stosowania.
Tworzenie i uruchamianie programów powłokiW najprostszym przypadku program powłoki (nazywany dalej również skryptem) to plik, który zawiera jedno lub więcej poleceń powłoki. Takich programów można używać w sposób podobny do aliasów, by oszczędzić sobie częstego wpisywania identycznych sekwencji poleceń. Możliwe jest również pisanie prostych programów wymagających interakcji użytkownika, na przykład instalujących inne programy.
Aby stworzyć skrypt powłoki, powinieneś utworzyć nowy plik (na przykład za pomocą edytora tekstów) i umieścić w nim polecenia, które mają zostać wykonane. Załóżmy, że w Twoim systemie plików zamontowany jest CD-ROM. Jest on montowany podczas uruchamiania systemu. Jeśli zmienisz dysk CD-ROM podczas pracy, musisz nakazać systemowi odczytanie nowego drzewa katalogów. Można to uzyskać przez odmontowanie, a następnie ponowne zamontowanie CD-ROM-u. Odpowiednia sekwencja poleceń ma postać:
umount /dev/cdrom
mount –t iso9660 /dev/cdrom /cdrom
Zamiast wpisywać oba te polecenia, można stworzyć krótki program w języku powłoki, nazwać go np. nowycd, i posługiwać się nim.
Istnieje kilka metod wykonywania programu zapisanego w pliku. Jedną z nich jest nadanie plikowi prawa do wykonywania, na przykład następującym poleceniem:
chmod +x nowycd
Możesz teraz wywołać skrypt nowycd poprzez wpisanie jego nazwy w wierszu poleceń.
Plik będący programem powłoki musi znajdować się w którymś z katalogów wchodzących w skład ścieżki przeszukiwania, w przeciwnym przypadku interpreter nie będzie potrafił go odnaleźć. Ponadto jeśli używasz interpretera tcsh, pierwszy wiersz musi zaczynać się od znaku #.
Innym sposobem wykonania programu zapisanego w pliku jest uruchomienie powłoki, dla której program został napisany, z nazwą pliku podaną jako parametr wywołania, np.
tcsh nowycd
Trzecią metodą jest użycie polecenia . (kropka) w powłokach pdksh i bash lub source w tcsh. Polecenie to powoduje wykonanie poleceń zawartych w pliku podanym jako parametr, np.
. nowycd
w przypadku bash i pdksh czy też
source nowycd
w przypadku tcsh.
Oto inna sytuacja, w której prosty skrypt może zaoszczędzić nieco czasu. Załóżmy, że pracujesz nad trzema plikami w danym katalogu i codziennie robisz ich kopię zapasową na dyskietce, wydając polecenia:
mount –t msdos /dev/fd0 /a
cp plik1 /a
cp plik2 /a
cp plik3 /a
Łatwiejszym sposobem będzie umieszczenie tych poleceń w pliku (o nazwie np. backup) i wywoływanie go jako programu powłoki jednym z podanych wcześniej sposobów.
Jeśli chcesz używać pliku backup jako programu powłoki, powinieneś przypisać mu prawo do wykonywania i umieścić go w jednym z katalogów wchodzących w skład ścieżki przeszukiwania.
Używanie zmiennychTak jak w każdym języku programowania, użycie zmiennych w programach powłoki jest sprawą bardzo ważną. Z niektórymi ze zmiennych powłoki (na przykład PATH czy PS1) miałeś już okazję się zapoznać, wiesz również, jak można nadać im wartość. W tym podrozdziale dowiesz się, jak można tworzyć własne zmienne i posługiwać się nimi w programach powłoki.
Nadawanie wartości zmiennejW powłokach bash i pdksh przypisanie odbywa się poprzez podanie nazwy zmiennej, znaku równości i wartości zmiennej, np.:
licznik=5
W tcsh należy do tego celu użyć polecenia set, np.:
set licznik=5
Jeśli używasz interpretera bash lub pdksh, upewnij się, że przed i po znaku równości nie występują spacje, ponieważ spowodują one błędną interpretację polecenia. Nie ma to znaczenia w przypadku powłoki tcsh.
Zauważ, że nie zachodzi potrzeba deklarowania zmiennych przed ich użyciem, jak ma to miejsce w takich językach, jak C czy Pascal, ponieważ w języku powłoki nie występuje pojęcie typów. Oznacza to, że tej samej zmiennej można używać zarówno do przechowywania tekstów, jak i liczb całkowitych. Tekst możesz przypisać zmiennej w taki sam sposób, jak liczbę całkowitą, np.:
imie=Piotr
w przypadku powłok bash i pdksh lub
set imie=Piotr
w przypadku tcsh.
Odczytywanie wartości zmiennejPotrafisz już przypisać zmiennej wartość; teraz trzeba jakoś ją odczytać. Można to zrobić przez wpisanie nazwy zmiennej poprzedzonej znakiem dolara; aby na przykład wypisać wartość zmiennej licznik na ekranie, można wydać polecenie:
echo $licznik
Jeśli znak dolara zostałby pominięty, na ekranie zostałoby wyświetlone słowo licznik.
Parametry pozycyjnei inne zmienne wewnętrzne powłoki
Parametry pozycyjne to specjalne zmienne powłoki, w których przechowywane są parametry wywołania przekazywane do programu. Pierwszy z parametrów programu zapisany jest w zmiennej o nazwie 1, drugi – 2 itd. Są to nazwy zarezerwowane, nie można więc tworzyć własnych zmiennych o takich identyfikatorach. Dostęp do wartości przechowywanych w tych zmiennych można uzyskać poprzedzając ich nazwy znakiem $, podobnie jak ma to miejsce w przypadku pozostałych zmiennych.
Poniższy przykładowy program wymaga podania dwóch parametrów, które następnie wyświetlane są w odwrotnym porządku:
#program odwroc – wyswietla parametry w odwrotnej kolejnosci
echo "$2" "$1"
Jeśli wywołasz taki program w następujący sposób:
odwroc kota ogonem
wynik będzie następujący:
ogonem kota
Istnieje jeszcze kilka zmiennych wewnętrznych powłoki, bez znajomości których trudno się obejść. Tabela 14.1 zawiera najważniejsze z nich wraz z krótkimi opisami.
Tabela 14.1. Wewnętrzne zmienne powłoki
Zmienna
Znaczenie
$#
Zawiera ilość argumentów przekazanych z wiersza poleceń do programu powłoki
$?
Zawiera wartość zwróconą przez ostatnio wykonane polecenie lub program
$0
Zawiera pierwszy wyraz wpisanego polecenia (czyli zazwyczaj nazwę skryptu)
$*
Zawiera wszystkie argumenty wywołania ($1 $2 $3 ...)
"$@"
Zawiera wszystkie argumenty wywołania, każdy z osobna ujęty w cudzysłów ("$1" "$2" "$3" ...)
CudzysłowyUżycie różnego rodzaju cudzysłowów oraz znaku \ (backslash) ma zasadnicze znaczenie dla programowania w języku powłoki. Służą one do ukrywania niektórych symboli przed interpreterem poleceń.
Podwójny cudzysłów jest „najsłabszy”. Jeśli tekst jest otoczony pojedynczym cudzysłowem, ignorowane są wszystkie znaki białe w nim zawarte, ale nadal interpretowane są wszystkie pozostałe symbole specjalne. Jeśli na przykład chcesz przypisać tekst Witam Cie do zmiennej pozdrowienie, powinieneś wydać polecenie:
pozdrowienie="Witam Cie" lub
set pozdrowienie="Witam Cie",
zależnie od tego, jakiego interpretera używasz.
Dzięki cudzysłowowi cały tekst Witam Cie traktowany jest jako jeden wyraz. Jeśli nie zostanie on otoczony cudzysłowem, bash i pdksh wygenerują komunikat o błędzie, natomiast tcsh podstawi tekst Witam, ignorując dalszą część wiersza.
„Najsilniejszy” jest cudzysłów pojedynczy (‘). Ukrywa on przed interpreterem wszystkie symbole specjalne. Stosowany jest, gdy dany tekst nie jest przeznaczony do interpretacji przez powłokę, ale przez inny program.
Jeśli chciałbyś w zmiennej pozdrowienie zamieścić również identyfikator użytkownika, powinieneś wydać polecenie:
pozdrowienie="Witam Cie $LOGNAME"
dla interpreterów bash i pdksh lub
set pozdrowienie="Witam Cie $LOGNAME"
dla tcsh.
Spowoduje ono podstawienie do zmiennej pozdrowienie tekstu Witam Cie root (o ile jesteś zalogowany jako root). W przypadku otoczenia tekstu pojedynczym cudzysłowem, nie uzyskałbyś pożądanego efektu, ponieważ wartość zmiennej LOGNAME nie zostałaby podstawiona. Zmienna pozdrowienie zawierałaby tekst Witam Cie $LOGNAME.
Zmienna LOGNAME to zmienna wewnętrzna powłoki, zawierająca identyfikator użytkownika, który uruchomił daną powłokę.
Trzecią metodą ukrywania symboli specjalnych przed interpreterem poleceń jest użycie symbolu \. Ukrywa on przed interpreterem jeden dowolny znak (ten, który następuje zaraz po symbolu \...