Programowanie W Shell'u.doc

(68 KB) Pobierz
1

1. Pierwszy program:

Na początek napiszmy program pokazujący zastosowanie zmiennych:

#!/bin/sh

ZMIENNA=Przykladowy tekst
# to jest komentarz

echo $ZMIENNA
echo "$ZMIENNA"
echo '$ZMIENNA'
echo `echo $ZMIENNA`

exit 0

Zanim będziesz chciał wykonać powyższy skrypt, nie zapomnij ustawić prawa wykonywania dla pliku zawierającego go: chmod +x plik.

Rezultat wykonania będzie następujący:

Przykladowy tekst
Przykladowy tekst
$ZMIENNA
Przykladowy tekst

Myślę, że zasady działania programu wyjaśniać nie trzeba.

Jednak że, wspomnę trochę o jego charakterystycznych punktach:

        Pierwsza linijka jest poprzedzona dwoma znakami #!. Otóż jest to informacja, że następujący po nich string określa ścieżkę do shell'a z jakim skrypt powinien zostać wykonany. 
       Należy także zapamiętać to, iż odnosząc się do zawartości jakiejś zmiennej,  poprzedzamy jej nazwę znakiem $.
       Bardzo przydatna jest możliwość zwracania  w UNIX'ie wartości wykonania programu (komenda exit 0). Standardowo przyjęło się, że 0 oznacza poprawnie wykonany program, a każda inna wartość oznacz błąd. Mechanizm ten przydaje się wtedy, gdy np. od wyniku wykonania jednego programu zależy to, czy zostanie wykonana inna komenda, np. test -f file && echo "Plik istnieje", spowoduje wyświetlenie napisu "Plik istnieje", jeżeli komenda test znalazła w aktualnym katalogu plik o nazwie "file" (o operatorze && powiem w dalszej części podręcznika).

 2. Zmienne

W skrypcie, prócz zmiennych zdefiniowanych przez nas mamy także dostęp do zmiennych środowiskowych. Jeżeli chcesz zobaczyć ich listę, wpisz w powłoce komendę set.
Znajdziesz tutaj min. takie zmienne:

HOME - katalog domowy aktualnego uzytkownika,
PATH - podzielona dwukropkami lista katalogów przeszukiwanych przez polecenia
PS1 - znak zgłoszenia polecenia, zazwyczaj $
PS2 - drugi znak zgłoszenia używany przy dodatkowym wejściu, na ogół >
itd...

Oprócz zmiennych środowiska, które są przekazywane do programu po uruchomieniu, istnieją także zmienne lokalne interpretatora. Zmienne lokalne mogą być przekształcone w dostępne globalnie zmienne środowiska (widoczne dla innych skryptów i programów wywoływanych z bieżącego programu) przez umieszczenie przed nimi słowa export.

Poniżej prezentuje listę zmiennych specjalnych dostępnych w środowisku. Mogą one zawierać na przykład parametry z wiersza poleceń:

 

$#

liczba przekazywanych parametrów

$0

nazwa skryptu shell'owego

$n

n-ty parametr

$*

wszystkie parametry

$$

numer ID bieżącego procesu

$?

wartość zwrócona przez ostatnie polecenie

3. Instrukcje sterujące.

 

3.1. Instrukcja warunkowa if.

Dzięki instrukcji if procedura może być uzależniona od pewnych warunków. Jeżeli jest spełniony pierwszy z warunków, to wykonuje się jedynie polecenie1. Po spełnieniu warunku2, wykonuje się polecenie2. Polecenie3 jest wykonane w przypadku niespełnienia żadnego z warunków:

if warunek1
then
               polecenie1
elif warunek2
then
               polecenie2
else
               polecenie3
fi

Ogólnie warunek jest wywołaniem zewnętrznego programu. Jeżeli zwraca on zero, to warunek jest spełniony. Specjalnym poleceniem służącym do tego celu jest polecenie test, które może być także wywoływane przy użyciu znaków [ ]. Proste porównanie dwóch ciągów znaków wygląda wtedy w następujący sposób:

if [  "$STRING" = "linux"  ]
then    echo "Stringi są takie same"
else     echo "Stringi są różne"
fi

Jeżeli wolisz umieszczać then w tej samej linii co if, musisz dopisać średnik oddzielający test od then:

if [  "$STRING" = "linux"  ]; then    
           echo "Stringi są takie same"
else    
            echo "Stringi są różne"
fi

Uwaga: zmiennej SRTING nie musisz umieszczać w cydzysłowiu, ale radzę ci, abyś się do takiego               zapisu przyzwyczaił, a dlaczego to zaraz ci pokażę:

Załóżmy, że nasza instrukcja warunkowa wygląda następująco:

if [  $STRING = "linux"  ]; then

Jeżeli teraz zmienna STRING okaże się pusta to interpretator postara się wykonać coś takiego:

if [   = "linux"  ]; then

Instrukcja taka nie jest dopuszczalna, więc program zakończy się błędem:

 [: =: brak operatora jednoargumentowego

Jeżeli zmienną STRING umieścimy w cudzysłowiu, to otrzymamy coś takiego:

if [  "" = "linux"  ]; then

Jak widać instrukcja ta jest jak najbardziej poprawna.

3.2 Instrukcja case.

Instrukcja case podobnie jak if pozwala nam tworzyć w procedurze rozgałęzienia, lecz w innej formie.
Do odróżnienia różnych możliwości używa się wyrażeń regularnych.
Konstrukcja case jest następująca:

case wartość in
       wzorzec [ | wzorzec] ...) instrukcje;;
       wzorzec [ | wzorzec] ...) instrukcje;;
esac

Konstrukcja ta może z początku wydawać się niezrozumiała, ale myślę, że poniższe przykłady wszystko wyjaśnią:

#!/bin/sh

echo "Podaj odpowiedź (TAK lub NIE):"

# instrukcja read pobiera dane wprowadzone z klawiatury
read wzorzec

case "$wzorzec" in
       "tak") echo "TAK";;
       "nie") echo "NIE";;
       "t") echo "TAK";;
       "n") echo "NIE";;
       "*") echo "Podano zly warunek";;
esac

Myślę, że podany przykład nie wymaga wyjaśnień.
Instrukcję wyboru można także zapisać w bardziej zwięzłej wersji:

case "$wzorzec" in
       "tak" | "t" | "TAK" | "T") echo "TAK";;
       "nie" | "n"| "NIE" | "N") echo "NIE";;
       "*") echo "Podano zly warunek";;
esac

3.3 Pętla while.

 Pętla while powtarza blok instrukcji, dopóki warunek jest spełniony. Podobnie jak w instrukcji if,
 warunek jest poleceniem zewnętrznym. Oto jej konstrukcja:

while warunek do
       instrukcje
done

Poniżej przykład wykorzystania:

#!/bin/sh

echo -n "Wprowadz string: "
read string

while [ "$string" != "koniec" ]; do
    ...

Zgłoś jeśli naruszono regulamin