2007-01 Jak tworzyć wygodne w użyciu skrypty Bash?

Jak tworzyc intuicyjne w użyciu skrypty Bash.

Spis Treści

Do czego skrypty Bash ?

Jak mamy zestaw czynności (komend), które zawsze musimy wkonać gdy chcemy coś zrobić, to możemy sobie uprościć to zadanie poprzez zautomatyzowanie pracy przy pomocy skryptu , np. Bash.

Czego wymagamy od intuicyjnego w użyciu skryptu Bash ?

Być może z czasem w tym tutorialu zamiesze odpowiedzi na wszystkie te i więcej pytań.
W razie braku - piszcie śmiało.

Najczęstsze błędy programistyczne

Bash jest językiem zorientowanym na polecenia systemowe.
Z tego wynika iż jest wielce wrażliwy na brak odstępów.
Najczęsztszym błędem przy wyrażeniach if jest zapis w stylu
if["$3"="-sed"];then podczas gdy powinny być odstępy pomiędzy poszczegulnymi składowymi
if [ "$3" = "-sed" ]; then. Przyczyną jest to iż zarówno "if" jak i "[" są to pewnego rodzaju polecenia.
Dlatego zamiast "[" można używać "test" lub innego programu.

Prosty praktyczny przykład

Załózmy że chęsto robimy backup katalogu domowego /home/user z sumą kontrolną.

$ cd /home
$ tar cvjf /mnt/backup/my_backup.tar.bz2 user
$ cd /mnt/backup
$ md5sum -b my_backup.tar.bz2 > my_backup.tar.bz2.md5

Aby sobie uprościć życie robimy plik tekstowy z tym samym ciągiem poleceń, rozszerzeniem ".sh" oraz pierwszą linią "#!/bin/bash"
Plik /home/user/do_backup.sh

#!/bin/bash
cd /home
tar cvjf /mnt/backup/my_backup.tar.bz2 user
cd /mnt/backup
md5sum -b my_backup.tar.bz2 > my_backup.tar.bz2.md5

i nadajmy mu uprawnienia wykonywanie chmod +x do_backup.sh .

Dzięki temu od teraz aby wkonać backup wystarczy wykonać

~/do_backup.sh

Dodajemy komentarze - zwiększamy czytelność


Aby kod skryptu był czytelny dla innych i dla nas po dłuższym czsie, najlepiej dodać komentarze.
Komentarze wstawiamy poprzedzając je znakiem "#". Dzieląc skrypt na bloki za pomocą pustych wierszy też zwiększamy czytelność.

Poprzedni przykłąd z komentarzami : Plik /home/user/do_backup.sh

#!/bin/bash

# Wchodzimy do katalogu bazowego.
cd /home
# Pakujemy katalog domowy user 
tar cvjf /mnt/backup/my_backup.tar.bz2 user

# Wchodzimy do katalogu kopi zapasowych
cd /mnt/backup
# Robimy sume kontrolna
md5sum -b my_backup.tar.bz2 > my_backup.tar.bz2.md5

W dalszej części tutoriala będę pracował na wersji kodu z jak najmniejszą liczbą komentarzy dla zwiększenia czytelności poradnika

Przykład z parametrami

Jak chcemy w pierwszym parametrze podawać nazwę pliku do którego ma się robić backup.
To w skrypcie podajemy zamiast tej nazwy "$1" , pod które zostanie podstawiony pierwszy parametr.
Plik /home/user/do_backup.sh

#!/bin/bash
cd /home
tar cvjf /mnt/backup/"$1".tar.bz2 user
cd /mnt/backup
md5sum -b my_backup.tar.bz2 > "$1".tar.bz2.md5

teraz wywołujemy polecenim

~/do_backup.sh moj_kolejny_backup

"Inteligentniejszy": skrypt z parametrami


Więc "inteligentniejszy" będzie w naszym przypadku sprawdzał czy użytkownik podał parametr.
Korszystamy z instrukcji warunkowej if [ ... ]; then ... fi

Robimy to n.p. tak, że dodamy instrukcję, którą w razie gdyby ostatni oczekiwany parametr był pusty -z "$1" (dla dwu -z "$2", dla trzech -z "$3",etc. ), po wyswietleniu informacji debbugerskiej wychodzimy exit.

#!/bin/bash

if [ -z "$1" ]; then
    echo Usage:
    echo $0 filename
    echo filename - backup file name
    exit
fi

cd /home
tar cvjf /mnt/backup/"$1".tar.bz2 user
cd /mnt/backup
md5sum -b my_backup.tar.bz2 > "$1".tar.bz2.md5

Jeżeli chcemy by jeszcze odpowiadał informacją o uruchamianiu przy parametrach "-h" i "-help" ujmujemy każdy z trzech warunków w nawiasy \( ... \) , po czym łączymy operatorami logicznymi "lub" (t.j. -o).
Otrzymujęmy następującą linstrukcję if:

if [ \( -z "$1" \) -o \( "$1" == "-h" \) -o \( "$1" == "--help" \) ]; then

Elementy wyrażeń logicznych


W mieniejszym tutoriale używamy następujących elementów wyrażeń logicznych :

element składni opis
\( ... \) nawiasy grupujące
-o OR - operator lub
-a AND - operator i
-z sprawdza czy
następujący po nim
parametr jest pusty
-r sprawdza czy
następujący po nim
parametr jest do odczytu

Więcej w polecanych stronach.

Dopytujemy się użytkownika.


Dopytujemy się użytkownika np. o brakujące parametry za pomocą read , które wywołane read mojazmienna wczyta do $mojazmienna wartosc.
Wtej sposób zmaiast podawać inforację o konieczności podania brakujących parametrów można się o nie dopytać.

Użyję tutaj jeszcze instrukcji przypisania.
Ma ona postać:
zmiennadocelowa = $zmiennaźródłowa

Odpowiednio zmodyfikowany skryp przykładowy:

#!/bin/bash

# podajemy informację przy wowołaniu z parametrem "-h" lub "-help"
if [ \( "$1"=="-h" \) -o \( "$1"=="-help" \) ]; then
    echo Usage:
    echo $0 filename
    echo filename - backup file name
    echo Type for this help:
    echo $0 -h
    exit
fi

# Sprawdz czy brakuje parametru jak tak to popos o niego i pobierz go
filename=$1
if [ -z "$1" ]; then
    echo Please type you target backup file name :
    read filename
fi

# backup
cd /home
tar cvjf /mnt/backup/"$filename".tar.bz2 user

# checksum
cd /mnt/backup
md5sum -b my_backup.tar.bz2 > "$filename".tar.bz2.md5

Polecane strony

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License