Architektura Systemów Informatycznych

Ćwiczenie 5 - Skrypty BASH

Plik skryptu

Plik skryptu to zwykły plik tekstowy, jednak zawierający polecenia wykonywane przez powłokę systemu. Dobrym zwyczajem jest nadawanie takim plikom rozszerzenia .sh. Dzięki temu łatwo można znaleźć je w systemie a edytor tekstu automatycznie dostosuje kolorowanie składni podczas edycji. Rozszerzenie jest opcjonalne, jednak aby było możliwe wykonanie zleconych zadań konieczne są dwie rzeczy: wskazanie interpretera poleceń oraz nadanie plikowi atrybutu wykonalności.

Wskazanie interpretera polega na dodaniu na początku pliku zakomentowanej, tzn. poprzedzonej znakiem # linijki z lokalizacja powłoki. W przypadku BASH wygląda ona następująco

#!/bin/bash

Natomiast atrybut wykonalności można nadać poprzez właściwości pliku w środowisku graficznym lub komendę:

chmod +x nazwa_skryptu

Najprostsze polecenie, wyświetlające tekst na standardowym wyjściu to echo. Na przykład:

echo "Hello World"

W celu wykonania skryptu można użyć następującego polecenia:

./nazwa_skryptu

ZADANIE 5.1:
W katalogu cw utwórz skrypt o dowolnej nazwie i odpowiednim rozszerzeniu. Wyświetl przy jego pomocy dowolny tekst.

Zmienne

Jak w każdym języku programowania w BASHu występują zmienne. Są proste w wykorzystaniu i nie ma podziału na typy danych - mogą zawierać tak liczby jak i ciągi znaków. Deklaracja zmiennej polega na podaniu nazwy i przyporządkowaniu wartości a wygląda następująco:

ZMIENNA="Dzień dobry"

Zarówno przed jak i po wartości zmiennej nie należy używać spacji!. Wywołanie zmiennej odbywa sie przy pomocy znaku dolara $:

echo $ZMIENNA

Zmienna może przechowywać wyniki działania jakiegoś polecenia. Takie działanie można zapisac na dwa sposoby: przy pomocy odwrotnych apostrofów

$ZMIENNA=`ls -l`

lub nawiasu:

$(ls -l)

Przy deklaracji zmiennych (i nie tylko) apostrofy i cudzysłowy maja specjalne znaczenie:

" "
podwójne cudzysłowy wskazują, iż pomiędzy nimi jest tekst lub wartości zmiennych zawierające spacje. Wenątrz nich rozpatrywane są znaki specjalne a za zmienne podstawiane ich wartości
' '
apostrofy oznaczają, iż pomiędzy nimi jest ciąg znaków a znaki specjalne (np. $) nie są interpretowane
\
backslash pozwala na tzw. maskowanie znaków (escape). Użycie go np. przed znakiem $ oznacza, że nie jest to zmienna ale zwykły znak.

Oprócz zmienych deklarowanych przez użytkownika istnieją specjalne przypadki: tzw. zmienne specjalne

$0
przechowuje nazwę skryptu
$1 - $9
przechowuja wartości parametrów (ciągi znaków po nazwie polecenia), z którymi wywołano polecenia
$@
przechowuje wartości wszystkich użytych parametrów

zmiene środowiskowe, przechowujące parametry pracy systemu np.

$HOME
adres katalogu domowego aktualnego użytkownika
$PWD
aktualny katalog
$USER
nazwa użytkownika
$RANDOM
losowa liczba generowana z każdym wywołaniem z zakresu 0-32767

oraz zmienne tablicowe. BASH umożliwia tworzenie tablic jednowymiarowych o nieskończenie wielu elementach oddzielonych spacjami. Początkiem indeksu elementów jest 0. Na przykład:

$rodzina=(mama tata syn córka)

utworzy tablicę $rodzina złożoną z czterech elementów. Odwołanie do konkretnego elementu wymaga użycia indeksu:

echo ${rodzina[2]} #wyświetli "syn"

Wyświetlić cała tablicę można przy pomocy znaku *lub @ a poznać ilośc elementów poprzez dodanie przed nazwą tablic znaku # - jeśli podany jest również indeks wyświetlona zostanie ilość znaków.

Dodawanie nowych elementów lub zmiana już istniejących odbywa się podobnie jak deklaracja zmiennych:

$rodzina[2]=córka #od tej pory są dwie córki

Natomiast do usuwanie elementów i tablic służy polecenie unset:

unset rodzina[2] #usuwa element o indeksie 2

Aby usunąć tablicę należy usunąć wszystkie jej elementy.


ZADANIE 5.2:
Utwórz skrypt wyświetlający nazwę ostatniego (najświeższego) zmodyfikowanego pliku z dowolnego katalogu.

Instrukcje warunkowe

Jednym z podstawowych narzędzi wykorzystywanym w skrypcie są instrukcje warunkowe a podstawową jest instrukcja if o bardzo prostej składni:

if [ warunek ]

then

polecenia do wykonania jeśli warunek jest prawdziwy

fi

Warunek zapisany jest w kwadratowych nawiasach (między nawiasem a warunkiem konieczne są spacja) i może przybierać wiele opcji (patrz "man bash") na przykład:

==
sprawdza czy wyrażenia są równie, np. "$zmienna=1"
!=
sprawdza czy wyrażenia są różne
-e
sprawdza czu istnieje plik
-lt
mniejsze niż
-gt
większe niż
-le
mniejsze lub równe
-ge
większ lub równe

Instrukcje if można rozbudować o części wykonywane jeśli warunek nie jest spełniony (else) lub o dodatkowe warunki sprawdzane jeśli pierwszy nie jest spełniony (elif):

if [warunek1]

then

polecenia1

elif [warunek2]

polecenia2

elif [warunek3]

polecenia3

else

polecenia4 fi

ZADANIE 5.3:
Do poprzednio utworzonego skryptu dodaj polecenie tworzące plik tekstowy zawierający listę plików z danego katalogu. Następnie utwórz instrukcję sprawdzającą czy zawiera on aktualne dane i aktualizającą plik w przypadku gdy tak nie jest.

Pętle

Kolejnym przydatnym narzędziem są pętle. Umożliwiają między innymi przeprowadzenie operacji jednocześnie na wielu plikach, konstruowanie menu itp. działan wymagających iteracji. Podstawową pętla jest for:

for i in lista

do

polecenia wykonywane dla każdego elementu listy

done

Oznaczenie elementu listy poprzez "i" nie jest konieczne ale zwyczajowe i przypomina, iż jest to iteracja.


ZADANIE 5.4:
Dodaj do tworzonego skryptu pętlę, tworzący w katalogu cw2 link symboliczny do każdego pliku tekstowego.

Autor: Michał Rzeszewski, Instytut Geokologii i Geoinformacji, UAM Poznań, mail: mrzeszewski@gmail.com
Creative Commons License
Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Na tych samych warunkach 2.5 Polska.