Programowanie W Shell'u, System operacyjny, Programowanie


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
       echo "Wprowadzono $string - zadanie nieokreslone."
       echo -n "Spróbuj jeszcze raz: "
        read string
done

3.4. Pętla for.

 Instrukcji for używamy do tworzenia pętli przez pewien zakres wartości, które mogą być dowolnym zestawem ciągów. Mogą być po prostu wymienione w programie lub stanowić - jak się to zwykle dzieje - rezultat rozwiązania przez powłokę nazw plików.
Oto jej konstrukcja:

for zmienna [in lista]
do
       
instrukcje
done

Jeżeli nie jest podana żadna lista, to instrukcje są wykonywane dla każdego parametru z wiersza poleceń:

for parametr
do
       echo $parametr
done

Następny przykład drukuje po kolei wszystkie nazwy z podanej listy:

for z_listy in 1 2 cokolwiek i tak dalej
do
       echo $z_listy
done

Otrzymamy następujący wynik:

1
2
cokolwiek
i
tak
dalej

Bardziej praktycznym przykładem jest użycie skryptu, który dodaje rozszerzenie .txt do wszystkich plików zakończonych na .doc:

for i in *.doc
do
       echo $i
       tmp=`basename $i .doc`
       mv $i $tmp.txt
done

3.5. Pętla until.

Pętla until jest bardzo podobna do funkcji while, z małym tylko wyjątkiem: pętla jest kontynuowana do czasu, aż warunek stanie się prawdziwy, czyli odwrotnie niż w pętli while.
Oto jej konstrukcja:

until warunek
do
       
instrukcje
done

4. Operatory.

Czasami (a nawet dość często) zechcemy połączyć polecenia w serię. Umożliwią nam to dwa omówione poniżej operatory ANDOR.

4.1. Operator AND.

Konstrukcje stworzone przy pomocy operatora AND umożliwią nam wykonanie serii poleceń, przy czym kolejne polecenie jest wykonywane tylko wtedy, gdy poprzednie zakończy się sukcesem:

instrukcja1 && instrukcja2 && instrukcja3 && ...

Poczynając od lewej, wykonywane jest każde polecenie i jeżeli zwróci true, wykonywane jest następne z prawej. Tak się dzieje, do czasu, gdy instrukcja zwróci false. Krótko mówiąc operator AND sprawdza warunek poprzedniego polecenia.

4.2. Operator OR.

Konstrukcje stworzone przy pomocy operatora OR, podobnie jak konstrukcje z operatorem AND, umożliwiają nam wykonanie serii poleceń, z tym że wykonywanie instrukcji przebiega dotąd, aż jakaś nie zakończy się sukcesem. Jeżeli tak się stanie to następne instrukcje nie będą już wykonywane.
Składnia jest następująca:

instrukcja1 || instrukcja2 || instrukcja3 || ...

Polecenia są kolejno wykonywane, poczynając od lewej. Jeśli polecenie zwróci false, to zostanie wykonane następne z prawej. Dzieje się tak, aż instrukcja zwróci true, gdyż wtedy nie zostanie już wykonana żadna instrukcja.

5. Funkcje.

Funkcje są tak przydatnym mechanizmem, że na pewno ucieszy cię wiadomość, że powłoka także pozwala nam na definiowanie ich.
Oto jak wygląda ich składnia:

nazwa_funkcji () {
       
instrukcje
}

Oto prosty przykład zastosowania:

#!/bin/sh

funkcja ()  {
       echo "Wlasnie wykonales funkcje."
}

funkcja

Warto tu wspomnieć, że podczas wywołania funkcji zmienne takie jak $*, $@, $#, $1, $2, itd. są zastępowane parametrami przekazywanymi do funkcji. Po zakończeniu działania funkcji zmienne te są ponownie ustawiane na wartości sprzed wywołania:

#!/bin/sh

funkcja () {
       echo "Lista przekazanych parametrow: $*"
       echo "Drugi parametr: $2"

}    

funkcja pierwszy 32 "ostatni parametr"

Po wywołaniu programu na ekranie zobaczysz:

Lista przekazanych parametrow:  pierwszy 32 ostatni parametr
Drugi parametr: 32

Funkcje także mają możliwość zwracania wartości liczbowych poprzez komendę return. Niestety, aby zwrócić string, musisz go zapamiętać w jakiejś zmiennej dostępnej z zewnątrz.

#!/bin/sh

wartosc="Wartosc oryginalna"

funkcja () {

       local warotsc_lokalna="zmienna lokalna"
       wartosc="wartosc zwracana"
       local wartosc_zwracana=34

       echo "Jestem wewnatrz funkcji. Wartosci zmiennych:"
       echo "warotsc lokalna: $warotsc_lokalna"
       echo "przekazywany string: $wartosc"
       echo "Opuszczam funkcje zwracajac wartosc liczbowa: $warotsc_zwracana"

        return $wartosc_zwracana

}

funkcja

echo "wartosc zwrocona prze funkcje: $?"
echo "warotsc_lokalna: $warotsc_lokalna"
echo "string przekazany przez funkcje: $wartosc"
 

Po wykonaniu programu na ekranie zobaczysz:

Jestem wewnatrz funkcji. Wartosci zmiennych:
warotsc lokalna: zmienna lokalna
przekazywany string: wartosc zwracana
 Opuszczam funkcje zwracajac wartosc liczbowa: 34
 wartosc zwrocona prze funkcje: 34
 warotsc_lokalna:
 string przekazany przez funkcje: wartosc zwracana

6. Polecenia.

 6.01. break

Polecenie break jest wykorzystywane do natychmiastowego opuszczenia pętli while, for lub until.

6.02. Polecenie ":" (dwukropek)

Polecenie to, jest poleceniem pustym, będącym nazwą umowną wartości true.
Komenda ta jest przydatna w warunkowych ustawieniach zmiennych. Na przykład:

: ${var:=wartosc}

Bez : powłoka próbowałaby obliczyć $var jako polecenie.

6.03. continue

Polecenie powoduje kontynuację wykonywania pętli while, for lub until.
Po jej napotkaniu program zaniedbuje realizację dalszych instrukcji będących treścią pętli, jednak (w przeciwieństwie do instrukcji break) sama pętla nie zostaje przerwana.
continue przerywa tylko ten obieg pętli i zaczyna następny, kontynuując pracę pętli.

 6.04. Polecenie "." (kropka)

Jeżeli w jakimś skrypcie (środowisku) chcesz wykonać inny podskrypt, to jest tworzone dla niego nowe środowisko. Jeżeli wykonywany podskrypt ustawiał jakież zmienne, to po jego zakończeniu, zostaną odtworzone ich wartości sprzed jego wykonania.
Często się jednak zdarza, że chcesz, aby twój podskrypt ustawiał wartości zmiennych tak, by były one cały czas dostępne, nawet po jego zakończeniu. Do tego służy właśnie polecenie ".".

Przykład:

Utwórz skrypt:

#!/bin/sh

ZMIENNA="Przykladowy tekst"

Ustaw teraz zmienną globalną:

ZMIENNA="Zmienna globalna".

Jeżeli teraz wykonasz polecenie echo $ZMIENNA, to na ekranie zobaczysz napis:

Zmienna globalna.


Wykonaj teraz powyższy skrypt. Jeżeli teraz napiszesz echo $ZMIENNA, to na ekranie ujrzysz ten sam napis co poprzednio.
Jeżeli teraz wykonasz skrypt w ten sposób: ". skrypt", i wywołasz ponownie komendę echo $ZMIENNA, to tym razem na ekranie ujrzysz napis:

 Przykladowy tekst.

6.05. echo

Pomimo zaleceń X/Open, zby używać polecenia printf we współczesnych powłokach, stosujemy polecenie echo, aby uprościć rezultat ciągu, po którym występuje znak nowej linii.
Powszechnym problemem jest pominięcie znaku nowej linii. Niestety nie ma na to jedynego dobrego sposobu, gdyż różne wersje Uniks'a mają zaimplementowane różne rozwiązania. Normalną metodą jest:

echo -n "Przykladowy takst"

lecz spotykasz się z:

echo -e "Przykladowy tekst\c"

http://free.of.pl/v/vedymin/frames/shell/shell_prog.htm#pierwszy_program



Wyszukiwarka

Podobne podstrony:
zasady grupy, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy
Normy prawne dotyczące rozpowszechniania programów komputerowych, 1.Systemy operacyjne i sieci kompu
środowiska, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy o
Prawo autorskie, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, syst
Jądro systemu operacyjnego, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2
Uruchamianie systemu WIN XP, java, javascript, oprogramowanie biurowe, programowanie, programowanie
instalacja i plug and play, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2
architektura, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy
profile, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy oper
Drukarka, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy ope
lab7, SEMESTRY, Sem 7, Interfejsy Programowe Systemow Operacyjnych, Laboratorium
System operacyjny, stud, I semsetr, WSTEP DO PROGRAMOWANIA, WDI
praca kontrolna, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, syst
Archiwizacja, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy
przekierowanie potoki filtry, java, javascript, oprogramowanie biurowe, programowanie, programowanie
PROGRAMOWANIE WSADOWE, Szkoła, Systemy Operacyjnie i sieci komputerowe, systemy, semestr I, systemy
rejestr, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, systemy oper
Prace kontrolne, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, syst
Klient i karta, java, javascript, oprogramowanie biurowe, programowanie, programowanie 2, UTK, syste

więcej podobnych podstron