UNIX omowienie 4


Rozdział 4
Skrypty shell a
4.1 Wprowadzenie
Często używane sekwencje poleceń można zapisać w pliku i poddać ten plik powłoce do inter-
pretacji, zamiast wpisywać każdorazowo je z klawiatury. Pliki te nazywane są skryptami shella
(shell scripts).
Przykład 4.1.1
Skrypt ll, podobny w działaniu do polecenia DIR z MS DOS:
$ cat > ll
pwd; ls -al

$ _
Wykonanie takiego pliku jest możliwe z linii poleceń poprzez podanie:
$ sh ll
Po dodaniu atrybutów wykonywalności:
$ chmod +x ll
lub
$ chmod 755 ll
można wywoływać podany skrypt bezpośrednio:
$ ll
Kilka rad dotyczących pisania skryptów:

Dobrym zwyczajem jest umieszczanie swoich skryptów w katalogu ~/bin.
28 pazdziernika 2001 roku wersja 0.2 45

Pierwsza linia skryptu powinna wyglądać następująco:
#!/bin/sh
ułatwia to interpretacje powłoce, pierwsze dwa znaki oznaczają skrypt, dalej podana jest
pełna nazwa programu wraz ze ścieżką, który ma dany skrypt interpretować.

Wiele dobrych przykładów skryptów można znalezć w katalogach: /bin, /usr/bin, /sbin,
... Ciekawe są również skrypty sekwencji bootującej umieszczonej w katalogu /etc/rc.d/.
Aby zorientować się, które pliki z zawartych w przeszukiwanych katalogach są skryptami
shella należy wydać polecenie:
$ file * | grep Bourne
Wypisane wówczas zostaną wszystkie pliki zinterpretowane przez polecenie file jako
skrypty shella Bournea.
4.2 Podstawy
4.2.1 Uruchamianie skryptów
Skrypty można uruchamiać, wywołując:

$ sh skrypt  skrypt wykonywany jest w shellu potomnym, nie wymagane są prawa
wykonania skryptu;

$ skrypt  skrypt wykonywany jest w shellu potomnym, wymagane są prawa wykona-
nia skryptu;

$ . skrypt  skrypt wykonywany jest w shellu bieżącym, nie wymagane są prawa
wykonania skryptu, nie można w ten sposób uruchamiać programów binarnych, nie można
podawać dodatkowych argumentów wywołania;

$ exec skrypt  program zamazuje istniejący proces shella, można w ten sposób wy-
konywać skomplikowane programy.
Określenie  wykonanie w shellu potomnym oznacza, że przed uruchomieniem skryptu urucho-
miony zostanie nowy proces shella, będący potomkiem shella, w którym skrypt został wywołany,
w tym nowym shellu skrypt zostanie uruchomiony. Natychmiast po zakończeniu skryptu, zakoń-
czony zostanie shell potomny.
28 pazdziernika 2001 roku wersja 0.2 46
4.2.2 Śledzenie wykonania skryptów  polecenie set
Do testowania skryptów używa się polecenia set1. Wybrane, najczęściej używane opcje tego
polecenia to:
set -n  polecenia skryptu nie wykonują się, są tylko wyświetlane, opcja użyteczna przy
testowaniu pętli;
set -v  każde polecenie skryptu jest wyświetlane tak, jak czyta je powłoka;
set -x  polecenia wyświetlane są w postaci interpretowanej przez powłokę.
Odwrócenie działania polecenia:
set +parametr
4.2.3 Komentarze
Od znaku # do końca linii tekst jest uważany za komentarz.
Przykład 4.2.2
Użycie komentarza w skrypcie:
#
# program ilustrujący komentarze
#
echo "Mój pierwszy skrypt" # wyświetlenie linii
Przykład 4.2.3
Komentarz użyty bezpośrednio z poziomu shella:
$ ls -al |
> # inny sposób użycia komentarza
> more
4.2.4 Zmienne
W rozdziale 3.2.2 wprowadzono pojęcie zmiennej używanej w powłoce. W tym rozdziale przed-
stawione zostaną metody korzystania ze zmiennych w skryptach, podane zostaną również za-
awansowane metody konstrukcji zmiennych.
1
Polecenie set zasadniczo służy do ustawiania zmiennych środowiska.
28 pazdziernika 2001 roku wersja 0.2 47
Odczyt wprowadzanych wartości
Do odczytu wartości zmiennych ze standardowego wejścia służy polecenie read. Odczytuje ona
linię ze standardowego wejścia, dzieli ją na słowa i przypisuje je do kolejnych zmiennych dostar-
czanych jako argumenty.
W bash dodatkowo jeśli po słowie read nie jest określona żadna zmienna, to odczytana wartość
zostanie przypisana zmiennej REPLY.
Przykład 4.2.4
Wczytywanie danych w skrypcie mój-skrypt:
echo "Wprowadz nazwy plików dla wejścia i wyjścia"
read plik1 plik2
echo Wejście: $plik1
echo Wyjście: $plik2
$ mój-skrypt
Wprowadz nazwy plików dla wejścia i wyjścia
dane raport
Wejście: dane
Wyjście: raport
Przykład 4.2.5
Użycie zmiennej REPLAY:
$ read
> moja zmienna
$ echo $REPLAY
moja zmienna
Dodatkowe możliwości konstrukcji zmiennych
Uzyskanie wartości zmiennej powiększonej o dodane dowolne znaki uzyskuje się za pomocą
konstrukcji:

$ zmienna dodatki
Przykład 4.2.6
$ Plik=/tmp/mój
28 pazdziernika 2001 roku wersja 0.2 48
$ echo $Plik
/tmp/mój
$ echo $Plik/*
$ echo $ Plik /*
/tmp/mój/*
Przekazywane parametrów do skryptu
Parametry pozycyjne służą do przekazywania argumentów z linii komend do skryptu (programu).
Bezpośrednio można zaadresować 9 parametrów, od $1 do $9, którym przypisane są argumenty
według schematu:
$ polecenie arg1 arg2 arg3 ...
| | | |
$0 $1 $2 $3 ...
Dodatkowo bash pozwala na bezpośrednie zaadresowanie większej ilości parametrów, parametry
dwucyfrowe należy podawać w postaci:

$ nr-parametru
$ polecenie arg1 arg2 arg3 ... arg10 arg11 ...
| | | | | |
$0 $1 $2 $3 ... ${10} ${11} ...
Polecenie shift i set
Polecenie shift pozwala przesuwać parametry pozycyjne w lewo, tzn. pierwszy jest tracony,
drugi zostaje pierwszym, trzeci staje się drugim, czwarty trzecim itd. Nie można przesuwać pa-
rametrów w prawo.
Do przypisania nowych wartości parametrom pozycyjnym służy Polecenie set, która jest wyko-
rzystywana również m.in. do odzyskiwania parametrów pozycyjnych, straconych po wykonaniu
komendy shift.
Przykład 4.2.7
Oto skrypt moj-skrypt, i jego użycie:
echo $1 $2 $3 $4
shift
28 pazdziernika 2001 roku wersja 0.2 49
echo $1 $2 $3 $4
shift 4
echo $1 $2 $3 $4
$ moj-skrypt a b c d e f g h i
a b c d
b c d e
f g h i
Przykład 4.2.8
moj-skrypt po modyfikacji:
echo $1 $2 $3 $4
set - to nowe argumenty
echo $1 $2
shift 2
echo $1
$ moj-skrypt a b c d
a b c d
to nowe
argumenty
Przykład 4.2.9
Fragment skryptu analizującego parametry przekazywane do skryptu w linii poleceń:
while [ $# -ge 1 ]; do
case $1 in
zrób coś
esac
shift
done
Zmienne związane z linią poleceń
Wartości niżej podanych zmiennych jest ustalana przez shell, nie może być ustalana przez użyt-
kownika:
$0 - nazwa wykonywanego polecenia.
28 pazdziernika 2001 roku wersja 0.2 50
$# - liczba argumentów polecenia. Po wykonaniu polecenia shift, zmniejszana jest wartość
$#.
$* - wszystkie argumenty z linii polecenia w postaci jednego ciągu znaków.
$@ - wszystkie argumenty z linii polecenia w postaci osobnych ciągów znaków. Zmienna
$@, jeśli nie występuje w cudzysłowie, jest identyczna jak zmienna $*.
$$ - numer aktualnie wykonywanego procesu (PID), czyli numer PID skryptu, zmienna ta
często jest używana do tworzenia plików tymczasowych, np. tmp=/tmp/moj.$$;
$! - numer procesu (PID) ostatniej komendy wykonywanej w tle;
$? - status wyjścia (exit status) ostatnio wykonywanej komendy;
Dobrze napisany skrypt weryfikuje liczbę parametrów z jaką jest wywoływany, oto kilka
przykładów:
Przykład 4.2.10
Skrypt data, który powinien być wywołany w sposób następujący:
$ data 19 02 2000
if [ $# -ne 3 ]; then
echo 1>&2 Wywołanie: $0 dd mm rrrr
exit 127
fi
Przykład 4.2.11
Sprawdzanie zakresu zmiennej (prezentowany przykład nie jest perfekcyjny):
case "$Dzien" in
[1-9]|[123][0-9]) ;;
*) echo 1>&2 Dzień \"$Dzien\" jest poza zakresem.
exit 127
;;
esac
W przypadku zerowej wartości zmiennych należy pamiętać o ujmowaniu ich w cudzysłowy.
Parametry i zmienne można usuwać poleceniem unset.
Przykład 4.2.12
Rozważmy następujący skrypt moj-skrypt:
28 pazdziernika 2001 roku wersja 0.2 51
pos=$*; echo $pos
num=$#; echo $num
shift
echo $#
$ moj-skrypt a b c
a b c
3
2
Zaawansowane metody modyfikacji zmiennych
${zmienna:-napis}
jeżeli zmienna jest ustalona i niezerowa
to wyświetl wartość zmiennej
w przeciwnym wypadku wyświetl napis
${zmienna:=napis}
jeżeli zmienna jest ustalona i niezerowa
to wyświetl wartość zmiennej
w przeciwnym wypadku wyświetl napis oraz przypisz zmienna=napis
${zmienna:?napis}
jeżeli zmienna jest ustalona i niezerowa
to wyświetl wartość zmiennej

w przeciwnym wypadku
jeśli napis jest niezerowy
to wyświetl napis
w przeciwnym wypadku zostanie wyświetlony komunikat:
Parametr null or not set

${zmienna:+napis}
jeżeli zmienna jest ustalona i niezerowa
to wyświetl napis
w przeciwnym wypadku nie stanie się nic
28 pazdziernika 2001 roku wersja 0.2 52
Przykład 4.2.13
$ echo $ZM1
$ echo  Wartość wynosi $ZM1:-123
Wartość wynosi 123
$ echo $ZM1
$ ZM1= 123
$ echo  Wartość wynosi $ZM1:-321
Wartość wynosi 123
$ echo $ZM2
$ echo $ZM2:=123
123
$ echo $ZM2
123
$ echo $ZM2:=321
123
$ echo $ZM2
123
$ echo $ZM3
$ echo $ZM3:?
INNA2: Parametr null or not set
$ echo $ZM3:?123
123
$ echo $ZM3
$ ZM3=321
$ echo $ZM3:?123
321
$ echo $ZM4
$ echo $ZM4:+123
28 pazdziernika 2001 roku wersja 0.2 53
$ ZM4=444
$ echo $ZM4:+123
123
$ echo $ZM4 444
Eksportowanie zmiennych
Eksportowanie zmiennych wykonuje się używając polecenia export:
$ export zmienna
Przykład 4.2.14
moj-skrypt:
user3=C
echo x = $x
echo user1 = $user1 " " user2 = $user2 " " user3 = $user3
$ user1=A; user2=B; moj-skrypt
$ (user1=A; user2=B; export user1 user2; moj-skrypt)
$ x=local
$ user1=A user2=B moj-skrypt
x=
user1 = A user2 = B user3 = C
$ echo user1=$user1 user2=$user2
user1= user2=
4.2.5 Status wyjścia (exit status)
W skryptach shella przyjęte jest, że jeśli program kończy się sukcesem wówczas do procesu
wywołującego zwracana jest wartość 0, w przeciwnym wypadku zwracana jest wartość różna od
zera.
Status wyjścia można odczytać korzystając z parametrów $? i $! (rozdział ??, str. ??).
Przykład 4.2.15
$ ls
bin Mail
$ echo $?
28 pazdziernika 2001 roku wersja 0.2 54
0
$ ls -z
ls: illegal option -z
$ echo $?
2
Polecenie exit
exit [ n ]
Wyjście ze skryptu ze statusem n (np. exit 1). Jeżeli n nie jest podane, status wyjściowy
będzie taki, jak ostatnio wykonanego polecenia.
Przykład 4.2.16
moj-skrypt:
echo Przykład działania komendy exit
exit 127
$ moj-skrypt
Przykład działania komendy exit
$ echo $?
127
Przykład 4.2.17
Zmodyfikowany moj-skrypt:
echo Przykład działania komendy exit
exit
$ moj-skrypt
Przykład działania komendy exit
$ echo $?
0
Polecenia true i false
Oba polecenia generują status wyjścia, przy czym true generuje zawsze status wyjścia 0, a
false generuje zawsze status wyjścia 1.
28 pazdziernika 2001 roku wersja 0.2 55
Przykład 4.2.18
$ if true
> then
> date
> fi
Tue Oct 23 11:20:31 EDT 1990
$ if false
> then
> date
> fi
4.2.6 Polecenie test
Służy do testowania wyrażeń numerycznych, plikowych i tekstowych, zwraca 0 (prawda) lub war-
tość różną od zera (fałsz).
test wyrażenie lub [ wyrażenie ]
Należy pamiętać, aby wpisywać spacje po obu stronach wyrażenia, używać cudzysłowów je-
śli używa się dodatkowych spacji w wyrażeniu. Możliwe jest grupowanie komend w nawiasach
objętych cudzysłowami.
Operatory instrukcji test:
! not
-a and
-o or
Testowanie typów plików:
-s plik plik istnieje i jest niezerowy;
-f plik plik istnieje i jest zwykłym plikiem;
-d plik plik istnieje i jest katalogiem;
-r plik plik istnieje, a wywołujący użytkownik posiada prawo czytania;
-w plik plik istnieje, a wywołujący użytkownik posiada prawo zapisu;
-x plik plik istnieje, a wywołujący użytkownik posiada prawo wykonywania;
p1 -nt p2 plik p1 jest nowszy niż plik p2;
p1 -ot p2 plik p1 jest starszy niż plik p2.
28 pazdziernika 2001 roku wersja 0.2 56
Testowanie wyrażeń numerycznych:
w1 -eq w2 w1 w2;

w1 -ge w2 w1 w2;
w1 -gt w2 w1 w2;
w1 -le w2 w1 w2;
w1 -lt w2 w1 w2;
w1 -ne w2 w1 w2.

Testowanie wyrażeń tekstowych:
te prawda gdy tekst te jest nie zerowy;
-z te prawda gdy tekst te jest zerowej długości;
-n te prawda gdy tekst te jest dłuższy od zera;
te1 = te2 prawda gdy teksty te1 i te2 są identyczne;
te1 != te2 prawda gdy teksty te1 i te2 nie są identyczne;
Przykład 4.2.19
if test -d $plik
then
echo $plik jest katalogiem
else
echo $plik jest plikiem
fi
if [ $Rok -lt 1901 -o $Rok -gt 2099 ]; then
echo 1>&2 Rok \"$Rok\" jest poza zakresem.
exit 127
fi
test -w /home/kowalski -a -d /home/jan
[ -w plik1 -o ! -x plik2 ]
[ ! \( -w plik1 -a -x plik1 \) ]
28 pazdziernika 2001 roku wersja 0.2 57
4.3 Konstrukcje programowe
4.3.1 Instrukcje warunkowe
Instrukcja if
if warunek
then
polecenia
fi
lub
if warunek
then
polecenia
else
polecenia
fi
Warunek może być formułowany z jednego lub kilku poleceń, przy czym if testuje tylko status
wyjścia ostatniego polecenia.
Zagnieżdżone instrukcje if  konstrukcja elif
if warunek
then
polecenia
else
if warunek
then
polecenia
else
polecenia
fi
fi
Konstrukcja elif umożliwia łatwiejsze i szybsze budowanie zagnieżdżonych konstrukcji if.
if warunek
then
28 pazdziernika 2001 roku wersja 0.2 58
polecenia
elif warunek
then
polecenia
else
polecenia
fi
Skrócona wersja instrukcji if  wykonywanie sekwencyjne
Jest to mechanizm umożliwiający wykonanie następnego polecenia, w zależności od wyniku
zakończenia polecenia poprzedniego.
polecenie1 &&polecenie2 &&polecenie3 &&...
polecenie1 ||polecenie2 ||polecenie3 ||...
Przykład 4.3.20
Polecenie: who|grep user1 > /dev/null && echo "UWAGA user1 pracuje!"
jest równoważne:
if who|grep user1 > /dev/null
then
echo "UWAGA user1 pracuje!"
fi
polecenie: who|grep user1 > /dev/null || echo "user1 nie pracuje!"
jest równoważne:
if who|grep user1 > /dev/null
then
...
else
echo "user1 nie pracuje!"
fi
Konstrukcja case
case warunek in
wzorzec1 )
28 pazdziernika 2001 roku wersja 0.2 59
polecenia
;;
wzorzec2 )
polecenia
;;
*)
polecenia
;;
esac
Konstrukcja case używana jest alternatywnie do mnogich if. Umożliwia wybór jednego z po-
danych wzorców w celu wykonania określonej grupy poleceń.
We wzorcach mogą występować metaznaki.
W jednym wzorcu można umieścić kilka wartości oddzielając je znakiwm |, np. Y|y|t|T.
Metaznak * zastępuje wszystkie wzorce, oznacza pozostałe przypadki, jeśli jest zawarty w in-
strukcji case musi być podany jako ostatni.
Przykład 4.3.21
case "$Rok" in
[0-9][0-9])
Rok=19${Rok}
;;
[0-9][0-9][0-9][0-9])
;;
*)
echo 1>&2 Rok \"$Rok\" jest poza zakresem.
exit 127
;;
esac
4.3.2 Pętle
Pętla for
for zmienna in arg1 arg2 ...
do
polecenia
done
28 pazdziernika 2001 roku wersja 0.2 60
Konstrukcja ta wykonuje polecenia kolejno dla każdego argumentu podanego w liście argumen-
tów (arg1 arg2 ...).
Przykład 4.3.22
#usuwania plików pośrednich
for i in /tmp /usr/tmp
do
rm -rf $i/*
done
Przykład 4.3.23
#zmiana praw dostępu
for i in  ls
do
chmod 740 $i
done
W przykładzie ?? pętle można założyć w sposób następujący:
for i in *
Pętle while i until
while warunek until warunek
do do
polecenia polecenia
done done
Pętla while wykonuje polecenia tak długo, aż testowany status wyjścia warunku (lub ostatniego
polecenia, jeśli warunek jest złożony) będzie 0. Przeciwieństwem pętli while jest pętla until,
która kontynuuje wykonywanie poleceń tak długo, aż testowany status wyjścia warunku będzie
różny od zera. Należy pamiętać, iż warunek może być złożony z wielu poleceń, wszystkie one
będą wykonane co najmniej raz, a tylko status wyjścia ostatniego z nich wpływa na wykonanie
poleceń z bloku do-done.
Przykład 4.3.24
Pętle wykonywane stąd do wieczności:
while true until false
do do
28 pazdziernika 2001 roku wersja 0.2 61
echo hallo echo hallo
done done
Instrukcja break
break przerywa wykonanie instrukcji pętli i powoduje przekazanie sterowania do pierwszej in-
strukcji poza pętlą.
Przykład 4.3.25
Przykład programu zawierającego instrukcję break, oraz program alternatywny, nie zawierający
tej instrukcji:
while true
do
polecenie1
if [ -f plik1 ]; then
rm plik1
else
break
fi
polecenie2
done
polecenie3
polecenie1
while [ -f plik1 ]
do
rm plik1
polecenie2
polecenie1
done
polecenie3
Instrukcja continue
continue powoduje przerwanie sekwencyjnego wykonywania instrukcji wewnątrz pętli i przejście
na początek pętli.
Przykład 4.3.26
28 pazdziernika 2001 roku wersja 0.2 62
Przykład programu zawierającego instrukcję continue, oraz program alternatywny, nie zawie-
rający tej instrukcji:
for var in $*
do
if [ $var -ge 0 ]; then
arg=$arg" "$var
continue
fi
var= expr $var\*-1
arg=$arg" "$var
done
echo $arg
for var in $*
do
if [ $var -lt 0 ]; then
var= expr $var\*-1
fi
arg=$arg" "$var
done
echo $arg
4.3.3 Funkcje w skryptach
Powłoka pozwala definiować nie tylko zmienne, ale i funkcje, które mogą zawierać dowolny ciąg
poleceń. Funkcje mogą być wywoływane z argumentami, z taką samą składnią jaka obowiązuje
przy przekazywaniu parametrów do skryptu.
nazwa_funkcji ()

polecenia

Przykład 4.3.27
Przykład funkcji wczytaj:
wczytaj ()
28 pazdziernika 2001 roku wersja 0.2 63
{
echo -n ${1:- Podaj nazwę:  }
read nazwa
echo Wybrano ${nazwa:=$2}
}
4.3.4 Reagowanie na sygnały zewnętrzne  polecenie trap
Poruszona teraz zostanie kwestia reakcji wykonywanego skryptu na działania zewnętrzne. W
systemie UNIX użytkownik może wysłać procesowi sygnał np. sygnał przerwania. Można wy-
magać od skryptu, aby na taki sygnał reagował w określony sposób, np. wyświetlając komunikat.
Do obsługi mechanizmu sygnałów w skryptach służy polecenie trap, o składni:
trap [polecenie ][numer sygnału ]
Oba parametry są opcjonalne. Jeśli zamiast polecenia podany zostanie pusty argument, np.   ,
sygnał będzie ignorowany. Natomiast użycie trap bez numeru sygnału spowoduje, że wybrane
polecenie zostanie wywołane po odebraniu dowolnego sygnału.
Mechanizm sygnałów dokładnie przedstawiony został w rozdziale ??. Wadą sygnałów jest
między innymi to, że proces otrzymujący sygnał nie wie, skąd go dostał. Wysłanie dowolnego
sygnału do procesu można uzyskać za pomocą polecenia kill:
kill -nr PID
gdzie nr oznacza numer wysyłanego sygnału, a PID identyfikuje proces do jakiego sygnał ma
zostać wysłany.
Poniżej przedstawiony został przykład ukazujący możliwość wykorzystania sygnałów w skryp-
tach powłoki.
Jakie może być praktyczne wykorzystanie tych mechanizmów na poziomie języka powłoki, skoro
wiadomo, że ten sam efekt można uzyskać w sposób doskonalszy za pomocą np. języka C. Otóż,
może to być przydatne tam, gdzie potrzeba jest nietypowego i szybkiego zastosowania progra-
mów już istniejących w systemie, szczególnie w dziedzinie administracji, np. skrypt badający
statystykę wykorzystania systemu, generujący raporty w określonych godzinach, oraz na sygnał
administratora lub skrypt, który na sygnał przekaże zebrane wyniki.
Przykład 4.3.28
Fragment skryptu reagującego na sygnał nr 2, tzn. sygnał przerwania.
28 pazdziernika 2001 roku wersja 0.2 64
trap  echo !
exit 1 2
Wywołanie sygnału przerwania, spowoduje wyświetlenie komunikatu i zakończenie procesu.
Przykład 4.3.29
Prosta aplikacja typu klient/serwer.
Serwer powinien zostać uruchomiony jako proces pracujący w tle, jego zadaniem jest oczeki-
wanie na zgłaszanie się różnych klientów. Świadczona przez niego usługa wykonywana jest po
każdym wykryciu odpowiedniego sygnału. W czasie gdy żadne sygnały nie nadchodzą, serwer
może wykonywać inne czynności, np. prace porządkowe, statystyczne itp.
Działanie serwera:
Funkcja sig() jest wywoływana po otrzymaniu przez serwer sygnału nr 5 (SIGTERM), po-
woduje zwiększenie o 1 zmiennej wewnętrznej a i wyświetlenie jej aktualnej wartości, a także
umieszczenie w pliku serv.rpt czasu wywołania.
Procedura report() służy do przesłania do pliku serv.rpt liczby wywołań i zakończenia pro-
cesu serwera. Wykonywana jest ona po otrzymaniu przez serwer dowolnego sygnału kończącego
jego pracę (z wyjątkiem sygnału 9  SIGKILL).
# serwer
# ------
# procedura obsługi sygnału
sig()
{
a= expr $a + 1
echo  date +%H:%M:%S >> serwer.rpt
echo Serwer: sygnał $a.
}
# procedura wywoływana przy zakończeniu pracy serwera
report()
{
echo Serwer: liczba wywołań = $a.
echo $a >> serwer.rpt
rm serwer.pid
echo Serwer: raport
cat ./serwer.rpt
28 pazdziernika 2001 roku wersja 0.2 65
rm serwer.rpt
echo Serwer: koniec pracy.
exit 0
}
# główna część programu serwera
if [ -f serwer.pid ] ; then
read PID < serwer.pid
echo Serwer: Program już działa \(pid = $PID\).
exit 255
else
echo $$ > serwer.pid
echo Serwer: Program uruchomiony \(pid = $$\).
a=0
trap sig 5
trap report 0
while :
do
:
# tutaj można umieścić polecenia, jakie serwer ma wykonywać
# w wolnych chwilach
done
fi
Aplikacja klienta.
Z pliku serv.pid klient odczytuje numer PID działającego serwera, jeśli plik nie istnieje sam
uruchamia serwer w tle i wówczas odczytuje jego PID za pomocą zmiennej $!. Po trzykrotnym
wywołaniu serwera klient kończy działanie.
# klient
# ------
# przekaż sygnał do serwera
callserv()
{
kill -5 $PID
}
28 pazdziernika 2001 roku wersja 0.2 66
# główna część programu klienta
echo Szukam serwera
if [ -f serwer.pid ] ; then
read PID < serwer.pid
else
./serwer.sh &
PID=$!
fi
echo Nr procesu serwera: $PID
echo Wysyłam sygnał po raz pierwszy
callserv
echo Wysyłam sygnał po raz drugi
callserv
echo i po raz trzeci
callserv
4.4 Przydatne polecenia i programy
4.4.1 Operacje na liczbach całkowitych  expr
Polecenie expr traktuje zmienną tekstową jako wartość numeryczną i wykonuje na niej operacje,
argumentami polecenia expr mogą być tylko liczby całkowite.
expr argument1 operator argument2
Możliwe operatory (operacje):

dodawanie,

odejmowanie,

mnożenie,

dzielenie,
% modulo,
: porównanie argumentów.
Po obu stronach operatora należy umieścić spację. Wynik nie będący liczbą całkowitą jest obci-
nany do wartości całkowitej. Aby przypisać wartość wyrażenia zmiennej, komendę expr należy
umieścić w akcentach.
28 pazdziernika 2001 roku wersja 0.2 67
Przykład 4.4.30
Przykład prostego skryptu (moj-skrypt):
a= expr 1 + 2
b= expr $a * 4
echo $a $b
$ moj-skrypt
3 12
4.4.2 Polecenie eval
4.4.3 Polecenie tput
4.4.4 Edytor strumieniowy sed
4.4.5 Polecenie awk
4.5 Polskie litery w skryptach
28 pazdziernika 2001 roku wersja 0.2 68


Wyszukiwarka

Podobne podstrony:
UNIX omowienie 1
UNIX omowienie 6
UNIX omowienie 2
UNIX omowienie 5
Active Directory omówienie domyślnych jednostek organizacyjnych
Unix lab 9
materialy pomocnicze unix
Kasy fiskalne 2014 z omowieniem ekspertow CMS Cameron McKenna
Berkeley Unix Summary
Omówienie metodyki prowadzenia poszczególnych analiz problemowych na
Unix Wprowadzenie Internet i inne sieci
Ćwiczenia Active Directory omówienie jednostek organizacyjnych
Instalacja pracowni omówienie
Systemy Operacyjne Unix Linux solarka2
OMÓWIENIE INTERFEJSÓW I KLAS ABSTRAKCYJNYCH W JĘZYKU JAVA
2 Omowienie pakietu MS Office i Open Office Ogolne wlasciwosci?ytora tekstu

więcej podobnych podstron