Programowanie w języku shell.
Język Shell jest przykładem języka skryptowego. Skrypt jest plikiem tekstowym zawierającym polecenia wykonywalne oraz wyrażenia języka powłoki sh, zatem przy pisaniu możemy użyć dowolnego edytora tekstu. W celu bezpośredniego wykonywania skryptu, poprzez podanie jego nazwy, niezbędne jest nadanie mu atrybutu wykonywalności. Taki plik najczęściej jest uruchamiany przy pomocy powłoki logowania użytkownika. W tym celu pierwsza linijka każdego skryptu powinna zawierać taką linijkę:
#!/pełna_ścieżka/nazwa_interpretera opcje
W przypadku języka Shell linijka pierwsza linijka ma taką oto postać:
#!/bin/sh
Podstawowe elementy języka Shell.
Zmienne:
Napisy są podstawowym typem zmiennych używanych w powłoce sh. Zmienne są definiowane przy użyciu operatora przypisania „=”.
nazwa_zmiennej=wartość_zmiennej
Wartość zmiennej stanowi napis. Nazwa zmiennej natomiast może zawierać duże jak i małe litery. Należy jednak pamiętać o tym że zmienne środowiskowe powłoki zapisuje się za pomocą dużych liter. Kolejną ważną informacją jest to, że między nazwą zmiennej, operatorem przypisania i wartością przypisywana, nie mogą występować odstępy. Aby zmienna była dostępna dla wszystkich programów uruchamianych z danego skryptu, to należy jej nazwę poprzedzić słowem kluczowym „export”.
export nazwa_zmiennej=wartość_zmiennej
Podczas definiowania i odwoływania się do zmiennych, często przydają się takie znaki jak „” lub ` ` które pozwalają na przypisywane napisów z tym, że znak apostrofu wyłącza mechanizm podstawiania nazw zmiennych. Znak dolara „$” służy do odwoływania się do wartości zmiennych. Natomiast polecenie powłoki „echo” używane jest do wypisywania tekstów.
$ echo "To jest shell:" "$SHELL"
To jest shell: /bin/bash
$ echo "To jest shell:" '$SHELL'
To jest shell: $SHELL
W celu bezpiecznego włączenia wartości zmiennych w napisy, należy nazwę zmiennej ująć w nawiasy klamrowe i poprzedzić ją znakiem dolara.
$ echo "To jest shell:${SHELL}-tu dlaszy ciąg"
To jest shell:/bin/bash-tu dlaszy ciąg
By umożliwić łączenie skryptów Shell z innymi poleceniami, korzysta się z mechanizmu wstawiania wyniku działania innych poleceń do wartości zmiennych.
$ DATE=`date` ; echo "Aktulna data: ${DATE}"
Aktulna data: Sun Nov 26 21:57:37 CET 2000
W tym przykładzie do zmiennej DATE przypisany jest wynik działania polecenia date.
Skrypt shell tak jak i inne programy uruchamiane z wykorzystaniem powłoki, ma dostęp do zmiennych środowiskowych.
$ echo "Katalog domowy to: ${HOME}"
Katalog domowy to: /home/gjn
Dodatkowo w każdym skrypcie definiuje się zmienne powiązane z parametrami wywołania tego skryptu. Zmienne te są postaci $N gdzie N jest liczbą przechowującą argumenty wywołania skryptu. Zmienna $0 przechowuje nazwę z jaką został wywołany skrypt, $# liczbę wszystkich argumentów, a $@ wszystkie argumenty.
#!/bin/sh
echo "Skrypt ${0} został wywołany z ${#} argumentami."
echo "Z czego 1. to: ${1}, a 3. to: ${3}"
Uruchomienie tego skryptu daje następujący wynik.
$ ./t1 alfa beta gamma
Skrypt ./t1 został wywołany z 3 argumentami.
Z czego 1. to: alfa, a 3. to: gamma
Instrukcje warunkowe:
W języku shell są zawarte tylko dwie podstawowe konstrukcje sterujące , takie jak if oraz case
Budowa instrukcji warunkowej if :
if [ warunek ]
then
instrukcje
elif [ warunek ]
then
instrukcje
else
instrukcje
fi
Budowa instrukcja case:
Case $ZMIENNA In
WARTOŚĆ1)
Instrukcja
;;
WARTOŚĆ2)
Instrukcja
;;
…
WARTOŚĆN)
Instrukcja
;;
*)
Instrukcja
;;
esac
linia w której znajduje się „*)” symbolizuje wszystkie pozostałe wartości.
Przy konstruowaniu warunków najczęściej stosuje się instrukcję test(l) , a dzięki powłoce możemy uprościć wywołanie tej instrukcji korzystając tylko z odpowiedniego parametru.
Operator |
Opis |
Operacje na plikach |
Prawdziwe jeżeli plik |
-e plik |
Istnieje |
-d plik |
Jest katalogiem |
-f plik |
Jest zwykłym plikiem |
-L plik |
Jest linkiem symbolicznym |
-r plik |
Można czytać |
-w plik |
Można zapisywać |
-x plik |
Można wykonywać |
Plik1 -nt plik2 |
Jeżeli plik1 jest nowszy niż plik2 |
Plik1 -ot plik2 |
Jeżeli plik1 jest starszy niż plik2 |
Porównywanie napisów |
Prawdziwe jeżeli |
-z napis |
Napis ma długość 0 |
-n napis |
Napis ma długość niezerową |
Napis1 = napis2 |
Napis1 jest identyczny z napisem2 |
Napis1 != napis2 |
Napis1 jest różny od napisu2 |
Operatory arytmetyczne |
Prawdziwe jeżeli wartości są |
Wart1 -eq wart2 |
Są sobie równe |
Wart1 -ne wart2 |
Różne |
Wart1 -lt wart2 |
|
Wart1 -le wart2 |
|
Wart1 -gt wart2 |
|
Wart1 -ge wart2 |
|
Pętle: