Podstawy http://zsk.tech.us.edu.pl/dydaktyka/laboratorium/sysoper/linux/8_6.html
Linux pozwala na tworzenie tzw. "skryptów". Są to pliki o charakterze tekstowym, zawierające szereg komend do wykonania przez powłokę. Skrypty bywają przydatne przy wielokrotnym wykonywaniu podobnych czynności. Programowanie skryptowe jest tematem zaawansowanym, w niniejszym kursie przedstawione zostaną jedynie jego podstawy dotyczące powłoki sh.
Najprostszym skryptem jest:
#!/bin/sh echo
Hello world!
Skrypt ten wyświetla na terminalu komunikat:
Hello world!
Zawartość skryptu jest prosta i przejrzysta. Pierwsza linia wymusza zastosowanie powłoki sh przy uruchomieniu skryptu, druga natomiast wyświetla stosowny komunikat.
Zmienne
Przy programowaniu skryptów przyjęło się nazywanie zmiennych dużymi literami. Ustalenie ich początkowej wartości następuje poprzez podanie jej nazwy, znaku równości oraz wartości, np:
ZMIENNA1="To jest tekst"
ZMIENNA2=123
Dalsze odwołania do zmiennych dokonywane są przez poprzedzenie nazwy zmiennej znakiem "$", np.
echo $ZMIENNA1
Na zmiennych można dokonywać również prostych operacji matematycznych. Ilustruje to poniższy przykład:
#!/bin/sh
TEKST="Hello world!"
LICZBA=12
SUMA=$[$LICZBA+111]
echo Tekst: $TEKST
echo Liczba: $LICZBA
echo Suma: $SUMA
Taki sktypt w wyniku działania wyświetli:
Tekst: Hello world!
Liczba: 12
Suma: 123
Pod zmienną można również podstawić tekst wprowadzony przez użytkownika. Ilustruje to poniższy skrypt:
#!/bin/sh
echo Wpisz tekst:
read TEST
echo Napisałeś:
echo $TEST
źródłem danych do zmiennej może być np. wywołanie zewnętrznego programu. W takim wypadku należy posłużyć się składnią:
ZMIENNA='polecenie zewnętrzne'
Parametry
Do skryptu przekazać można parametry wywołania. Parametry można używać podobnie jak zmienne, jednak bez zmiany ich wartości. Każdy parametr wywołania skryptu posiada swój kolejny numer. Nazwa skryptu to parametr numer 0. Pierwszy parametr wywołania oznaczony jest liczbą 1. Odwołania w treści skryptów do parametrów wyglądają następująco:
$* - wszystkie parametry począwszy od 1
$0 - parametr 0 - nazwa skryptu
$1 - parametr 1
...
$9 - parametr 9
$# - liczba parametrów
$$ - numer procesu (przydatne przy tworzeniu plików
tymczasowych)
Skrypt ilustrujący wykorzystanie parametrów:
#!/bin/sh
TYMCZAS=/tmp/skrypt_tmp.$$
echo Nazwa skryptu: $0
echo Liczba parametrów: $#
echo Pełne parametry wywołania: $*
echo Parametr 1: $1
echo Parametr 2: $2
echo Parametr 3: $3
echo Parametr 4: $4
echo Parametr 5: $5
echo A teraz następuje trzykrotny shift...
shift
shift
shift
echo Parametr 1: $1
echo Parametry pełne: $*
echo PID: $$
echo Nazwa pliku tymczasowego: $TYMCZAS
Skrypt został wywołany poprzez:
./skrypt_przykladowy pierwszy drugi 3 4 to jest piąty szósty i tak dalej
Wynik działania tego skryptu:
Nazwa skryptu: ./skrypt_przykladowy
Liczba parametrów: 9
Pełne parametry wywołania: pierwszy drugi 3 4 to jest piąty szósty i tak dalej
Parametr 1: pierwszy
Parametr 2: drugi
Parametr 3: 3
Parametr 4: 4
Parametr 5: to jest piąty
A teraz następuje trzykrotny shift...
Parametr 1: 4
Parametry pełne: 4 to jest piąty szósty i tak dalej
PID: 706
Nazwa pliku tymczasowego: /tmp/skrypt_tmp.706
Warunki
Możliwe do zrealizowania jest również przetwarzanie warunkowe. Do tego celu służy instrukcja "if ... then ... else ... fi". Prześledzić to można na prostym przykładzie:
#!/bin/sh
DZIEN_ROKU=`date +%j`
if [ $DZIEN_ROKU -le 178 ] ; then
echo Pierwsza połowa roku;
else
echo Druga połowa roku;
fi
W skrypcie tym `date +%j` zwraca numer kolejnego dnia w roku. Warunek w instrukcji if oznacza "jeśli zmienna DZIEN_ROKU jest mniejsza lub równa 178". Więcej informacji na temat warunków otrzymać można w pomocy kontekstowej do test(1).
Możliwe jest również zagnieżdżenie warunków (tzw. "else if"). Dokonuje się tego poprzez konstrukcję "elif ... then ..." analogicznie jak w przypadku instrukcji if.
Innym rodzajem instrukcji warunkowej jest konstrukcja "case ... in ... ;; esac". Jej działanie prześledzić można na przykładzie:
#!/bin/sh
case $1 in
pomoc) echo "Ten skrypt nie posiada pomocy!" ;;
help) echo "Używaj języka polskiego!" ;;
*) echo Napisałeś $1;;
esac
Skrypt ten, w zależności od podanego parametru wyświetla odpowiedni napis. Konstrukcja *) obejmuje wszystkie pozostałe możliwości.
Pętle
Do powtarzających się operacji przydatne są pętle. Istnieją trzy instrukcje organizujące skrypty powłoki w pętle.
Pierwszą z nich jest "for ... in ... do ... done". Przykład użycia:
#!/bin/sh
echo Podałeś następujące parametry:
for PARAMETR in $* ; do
echo $PARAMETR ;
done
Skrypt ten listuje wszystkie parametry wywołania programu. Na przykład dla wywołania:
./skrypt_przykladowy pierwszy 2 trzeci
Wynik będzie następujący:
Podałeś następujące parametry:
pierwszy
2
trzeci
Kolejną instrukcją zapętlającą jest "while ... do ... done". Przykład użycia w nieskończonej pętli:
#!/bin/sh
LINE=0
echo Wpisz liczby. 0 = koniec.
while true ; do
read LICZBA
SUMA=$[$SUMA+$LICZBA]
if [ $LICZBA = "0" ] ; then
break
fi
done
echo Suma: $SUMA
Skrypt sumuje liczby wprowadzone przez użytkownika, aż użytkownik wpisze 0. W skrypcie tym wykorzystano pętle while, a jako warunek wpisano warunek zawsze prawdziwy - true. Przerwanie pętli następuje w momencie wykonania instrukcji break. Do sterowania tą pętlą istnieje jeszcze jedna instrukcja - continue, która wymusza kolejną iteracje pętli.
Przykład działania skryptu:
Wpisz liczby. 0 = koniec.
100
33
-12
0
Suma: 121
Ostatnią instrukcją organizującą pętle jest "until ... do ... done". Działa ona identycznie jak while, z wyjątkiem tego, że warunek jest zanegowany.