Bash skrypty

Podstawy pisania skryptów w bashu - budowa i prawa wykonywalne skryptów, składnia poleceń BASHa

Polecenia BASHA można łączyć ze sobą tworząc skrypty, które dodatkowo mogą zawierać np. wyrażenia logiczne oraz odwoływać się do innych aplikacji.

Jako zwykły użytkownik wykonaj w konsoli:
touch skrypt
chmod 755 skrypt
Następnie otwórz plik "skrypt" w edytorze (nano, pico, jakiś ze środowiska graficznego). I wpisz następującą zawartość:
echo 'To jest tekst'
echo "A to drugi"
zmienna="cześć"
echo "Wartość zmiennej to: $zmienna"
echo 'Pojedynczy cudzysłów i $zmienna'
Następnie wykonaj plik wpisując w konsoli ./plik . Zobaczysz coś takiego:
To jest tekst
A to drugi
Wartość zmiennej to: cześć
Pojedynczy cudzysłów i $zmienna
Powyższy skrypt BASHa prezentuje podstawowe jego składniki. Polecenie echo wyświetla tekst, jeżeli jest on w podwójnym cudzysłowie - będzie parsowany przez powłokę (zmienne zostaną zamienione na ich wartości) jeżeli pojedyncze - tekst nie będzie parsowany przez powłokę. Zmienną deklarujemy:
zmienna = "wartość"
A wywołujemy za pomocą $zmienna (dodajemy znak dolara). Skrypt kończy wywołanie zmiennej w tekście z podwójnymi i pojedynczymi cudzysłowami. W przypadku tych drugich "$zmienna" nie zostanie zamieniona na wartość zmiennej. Zmienną można też wyświetlić bezpośrednio: echo $zmienna

Pobieranie danych od użytkownika

Chcemy skrypt, który poprosi użytkownika o dane, np:
echo 'Jak masz na imię?'
read zmienna
echo "Twoje imie to: $zmienna"
Wykonanie skryptu spowoduje wyświetlenie tekstu "Jak masz na imię?", a użytkownik będzie mógł wprowadzić dane, np. jeżeli wpiszemy "Piotr" to skrypt odpowie "Twoje imie to: Piotr". Skorzystaliśmy tutaj komendy read (read nazwa_zmiennej). Komenda ta czeka aż użytkownik wpisze coś i wciśnie enter. To co wpisał przypisane zostanie zmiennej o podanej nazwie.

Skrypt przykładowy 1 - Generator wizytówki - coś ala BASHowa księga gości

Chcemy prosty skrypt BASHA, który pobierze dane takie jak Imię i Nazwisko, adres Email i numer GG i zapisze do pliku. Oto kod
#!/bin/bash
echo 'Witaj w generatorze wizytówek v. 13.666'
echo '#####################################'
echo 'Program poprosi cię o wpisanie różnych danych.'
echo 'Po wpisaniu wciśnij Enter by przejść dalej.'
echo '#####################################'
echo 'Podaj swoje Imię i Nazwisko:'
read name
echo 'Podaj swój adres E-Mail:'
read mail
echo 'Podaj numer Gadu-Gadu:'
read gg
echo '#####################################'
echo 'Pobieranie danych zakończone'
touch wizytowka.txt
echo "$name" >> wizytowka.txt
echo "Email: $mail" >> wizytowka.txt
echo "Gadu-Gadu $gg" >> wizytowka.txt
echo 'Generowanie wizytówki zakończone'
echo 'Plik wizytowka.txt gotowy!'
echo '#####################################'
Wykonanie skryptu będzie wyglądać np. tak:
Witaj w generatorze wizytówek v. 13.666
#####################################
Program poprosi cię o wpisanie różnych danych.
Po wpisaniu wciśnij Enter by przejść dalej.
#####################################
Podaj swoje Imię i Nazwisko:
Piotr M
Podaj swój adres E-Mail:
tajny@email.pl
Podaj numer Gadu-Gadu:
123456
#####################################
Pobieranie danych zakończone
Generowanie wizytówki zakończone
Plik wizytowka.txt gotowy!
#####################################
I stworzy plik wizytowka.txt o zawartości:
Piotr M
Email: tajny@email.pl
Gadu-Gadu 123456
Przy okazji >> dopisuje dane do pliku więc wielokrotne wywołanie skryptu nie nadpisze danych...

Parametry wywołania

Wiele aplikacji przyjmuje parametry, np. ls -a. Bardzo prosto parametry te "przechwycić".
#!/bin/bash
echo "Nazwa skryptu to: $0"
echo '------------------------------------'
echo "Nazwa pierwszego argumentu to: $1"
echo '------------------------------------'
echo "Wszystkie argumenty: $*"
echo '------------------------------------'
echo "Podałeś $# poleceń"
Wywołanie ./a2.sh polecenie1 polecenie2 polecenie3 wyświetli:
Nazwa skryptu to: ./a2.sh
------------------------------------
Nazwa pierwszego argumentu to: polecenie1
------------------------------------
Wszystkie argumenty: polecenie1 polecenie2 polecenie3
------------------------------------
Podałeś 3 poleceń
$0 - nazwa skryptu, $n - wartość n-tego parametru, $* - wszystkie parametry, $# - liczba poleceń.

Skrypt przykładowy 2 - Generator wizytówki z wyborem pliku

#!/bin/bash
echo 'Witaj w generatorze wizytówek v. 13.666'
echo '#####################################'
echo 'Program poprosi cię o wpisanie różnych danych.'
echo 'Po wpisaniu wciśnij Enter by przejść dalej.'
echo '#####################################'
echo 'Podaj swoje Imię i Nazwisko:'
read name
echo 'Podaj swój adres E-Mail:'
read mail
echo 'Podaj numer Gadu-Gadu:'
read gg
echo '#####################################'
echo 'Pobieranie danych zakończone'
touch $1
echo "$name" >> $1
echo "Email: $mail" >> $1
echo "Gadu-Gadu $gg" >> $1
echo 'Generowanie wizytówki zakończone'
echo "Plik $1 gotowy!"
echo '#####################################'
Zakładamy że skrypt wywołujemy podając jeden parametr - nazwę pliku :)

Instrukcje warunkowe

Możemy korzystać z instrukcji warunkowych - Jeżeli coś to wtedy, a jeżeli nie to coś... Porównania i operacje logiczne:
PORÓWNANIA LICZBOWE
-gt: większy od
-lt: mniejszy od
-ge: większy, równy od
-le: mniejszy, równy od
-eq: równy
-ne: różny od
PORÓWNANIA TEKSTOWE
-z: sprawdza czy ciąg jest pusty
-n: sprawdza wartość ciągu
=: równy
!=: różny
Str: sprawdza czy ciąg jest zerowy
OPERACJE LOGICZNE
-a: Logiczne i (zamiast -a można stosować &&)
-o: Logiczne lub (można stosować też ||)
!: Logiczne nie
TESTY NA PLIKACH
-f: Plik istnieje i jest zwykłym plikiem
-s: Plik nie jest pusty
-r: Plik jest możliwy do odczytu
-w: Plik może być modyfikowany
-x: Plik może być uruchamiany
-d: Jest katalogiem
-h: Jest dowiązaniem symbolicznym
-c: Nazwa odnosi się do urządzenia
Instrukcja warunkowa IF... ma postać:
if komenda then
	akcja
fi

if komenda then
	akcja
else
	akcja
fi
Przykład:
if [ "$#" -gt 2 ]
	then
	echo 'Podałeś więcej niż 2 parametry'
	else
	echo 'Podałeś mniej niż 2 parametry'
fi
Wielkość liter operatorów i spacje mają znaczenie! Powyższy kod wyświetli "Podałeś więcej niż 2 parametr" jeżeli wywołamy skrypt z 3 lub większą ilością parametrów, a "Podałeś mniej niż 2 parametry" jeżeli będzie ich 2 lub mniej. Instrukcje warunkowe można rozbudowywać o elif - else if:
if [ "$#" -gt 2 ]
	then
	echo 'Podałeś więcej niż 2 parametry'
	elif [ "$#" -eq 2 ]
	then
	echo 'Podałeś 2 parametry'
	else
	echo 'Podałeś mniej niż 2 parametry'
fi
Warunki można łączyć za pomocą operatorów logicznych:
if [ "$#" -gt 2 -a "$#" -lt 5 ]
	then
	echo 'Podałeś więcej niż 2 parametry'
	else
	echo 'Podałeś albo mniej niż 2 parametry lub więcej niż 5'
fi


Pętle

- while komenda do akcja done - while wykonuje akcję dopóki komenda ma wartość Prawda (true)
- until komenda do akcja done - until wykonuje akcję dopóki komenda ma wartość Fałsz (false)
- for zmienna in lista-wartości do akcja done - Pętla for-in zaprojektowana została do użytku z listami wartości. Są one kolejno przyporządkowywane zmiennej
-for zmienna do akcja done - Odnosi się do argumentów skryptu przyporządkowując je kolejno zmiennej

#!/bin/bash
for plik in /home/piotr/*
do
echo "Plik lub katalog: $plik"
done
Dla każdego elementu w /home/piotr (plik lub katalog) wykonaj (do) echo :) Po kolei nazwa pliku/katalogu przypisywana jest zmiennej $plik.

#!/bin/bash
for parametr
do
echo "Plik $parametr ma hasza:"
md5sum $parametr
done
Skrypt wywołujemy: skrypt.sh plik1.txt plik2.txt - z nazwami plików jako parametry. Dla każdego pliku (w tym przykładzie, nie muszą to być zawsze pliki) obliczamy sumę kontrolną w md5.

#!/bin/bash
powtorka = "tak"
while [ "$powtorka"==tak ]
do 
echo -n $powtorka
echo 'Witaj w generatorze wizytówek v. 13.666'
echo '#####################################'
echo 'Program poprosi cię o wpisanie różnych danych.'
echo 'Po wpisaniu wciśnij Enter by przejść dalej.'
echo '#####################################'
echo 'Podaj swoje Imię i Nazwisko:'
read name
echo 'Podaj swój adres E-Mail:'
read mail
echo 'Podaj numer Gadu-Gadu:'
read gg
echo '#####################################'
echo 'Pobieranie danych zakończone'
touch $1
echo "$name" >> $1
echo "Email: $mail" >> $1
echo "Gadu-Gadu $gg" >> $1
echo 'Generowanie wizytówki zakończone'
echo "Plik $1 gotowy!"
echo '#####################################'
echo 'Wpisz "tak" jeżeli chcesz dodać kolejny wpis'
read powtorka
done
blog comments powered by Disqus

Kategorie

Strony