Bash - skrypty i automatyzacja
Skrabnica wiedzy o bash-u: http://mywiki.wooledge.org/BashPitfalls
Shebang
Shebang (lub hashbang) to specjalna linia umieszczana na początku pliku skryptu lub programu, która wskazuje systemowi operacyjnemu, który interpreter powinien być użyty do wykonania tego pliku. W przypadku skryptów Bash, shebang zazwyczaj wygląda tak:
bashCopy code#!/bin/bashTen shebang informuje system, że plik powinien być interpretowany przy użyciu programu bash. Jeśli shebang jest prawidłowo ustawiony, możesz uruchamiać skrypt, nie musząc ręcznie wywoływać interpretera Bash.
Przykład użycia shebang:
Utworzenie skryptu Bash: Utwórzmy prosty skrypt Bash o nazwie
hello.sh, który wyświetli powitanie:bashCopy code#!/bin/bash echo "Witaj, świecie!"Nadanie praw do wykonania: Aby móc uruchomić ten skrypt, nadajmy mu prawa do wykonania:
bashCopy codechmod +x hello.shUruchomienie skryptu: Teraz możemy uruchomić skrypt za pomocą polecenia:
bashCopy code./hello.shDzięki shebang
#!/bin/bash, system wie, że ma użyć interpretera Bash do wykonania skryptu, i wyświetli "Witaj, świecie!" na konsoli.
Shebang jest niezbędny, aby system wiedział, jakie środowisko interpretacyjne użyć do uruchomienia skryptu, co jest szczególnie ważne w przypadku wielu rodzajów skryptów i języków programowania dostępnych na systemie.
Zmienne
W Bash zmienne są używane do przechowywania i manipulacji danymi. Mogą zawierać zarówno tekst, jak i liczby, a ich wartości można dynamicznie zmieniać w trakcie wykonywania skryptu. Zmienne w Bash nie wymagają deklaracji typu, co czyni Bash językiem dynamicznym.
Składnia deklaracji i przypisywania zmiennej:
bashCopy codezmienna="wartość"zmienna: Nazwa zmiennej.wartość: Wartość, którą chcemy przypisać zmiennej.
Przykład użycia zmiennych:
bashCopy code# Deklaracja i przypisanie wartości do zmiennej
moje_imie="Jan"
wiek=30
# Wyświetlenie zawartości zmiennych
echo "Cześć, jestem $moje_imie i mam $wiek lat."
# Zmiana zawartości zmiennej
moje_imie="Adam"
# Ponowne wyświetlenie zawartości zmiennej
echo "Teraz jestem $moje_imie."
W wyniku działania tego skryptu zostaną wyświetlone następujące komunikaty:
cssCopy codeCześć, jestem Jan i mam 30 lat.
Teraz jestem Adam.Zmienne w Bash są bardzo wszechstronne i mogą przechowywać różne rodzaje danych. Są one używane do przechowywania informacji, konfiguracji, wyników obliczeń i wielu innych celów w skryptach Bash.
Operacje na zmiennych
Operacje na zmiennych w Bashu pozwalają na manipulację danymi przechowywanymi w zmiennych. Bash obsługuje operacje matematyczne, konkatenacji łańcuchów, porównań i wielu innych operacji.
Składnia operacji na zmiennych:
Operacje matematyczne: Możesz używać podwójnych nawiasów okrągłych
(( ))do wykonywania operacji matematycznych na zmiennych.bashCopy codea=10 b=20 suma=$((a + b))Konkatenacja łańcuchów: Możesz konkatenować łańcuchy tekstowe, używając
+lub+=.bashCopy codeimie="Jan" nazwisko="Kowalski" pelne_imie="$imie $nazwisko"Porównania: Bash umożliwia porównywanie wartości zmiennych, na przykład do sprawdzania warunków w poleceniach warunkowych
if.bashCopy codea=10 b=20 if [ $a -lt $b ]; then echo "$a jest mniejsze od $b." fi
Przykład użycia operacji na zmiennych:
bashCopy code# Operacje matematyczne
a=10
b=20
suma=$((a + b))
roznica=$((a - b))
echo "Suma: $suma, Różnica: $roznica"
# Konkatenacja łańcuchów
imie="Jan"
nazwisko="Kowalski"
pelne_imie="$imie $nazwisko"
echo "Pełne imię: $pelne_imie"
# Porównania
liczba1=15
liczba2=25
if [ $liczba1 -gt $liczba2 ]; then
echo "$liczba1 jest większe od $liczba2."
else
echo "$liczba1 nie jest większe od $liczba2."
fi
W wyniku działania tego skryptu zostaną wyświetlone następujące komunikaty:
bashCopy codeSuma: 30, Różnica: -10
Pełne imię: Jan Kowalski
15 nie jest większe od 25.
Operacje na zmiennych pozwalają na dynamiczne przetwarzanie danych i dostosowywanie zachowania skryptu do bieżących potrzeb. Wartość zmiennych może być zmieniana w trakcie działania skryptu, co czyni je potężnym narzędziem do automatyzacji zadań.
Argumenty wiersza poleceń
Argumenty wiersza poleceń pozwalają na przekazywanie danych do skryptu lub programu podczas jego uruchamiania. W Bashu, argumenty wiersza poleceń są dostępne jako zmienne specjalne $1, $2, $3, itp., które odnoszą się do kolejnych argumentów przekazanych przy uruchomieniu skryptu.
Składnia argumentów wiersza poleceń:
$0: Nazwa samego skryptu (zwykle nie jest używana jako argument).$1,$2,$3, ...: Argumenty wiersza poleceń, gdzie$1to pierwszy argument,$2to drugi argument, itd.
Przykład użycia argumentów wiersza poleceń:
bashCopy code# Skrypt odbierający i wyświetlający argumenty wiersza poleceń
echo "Nazwa skryptu: $0"
echo "Pierwszy argument: $1"
echo "Drugi argument: $2"
Uruchomienie skryptu z argumentami:
bashCopy code./skrypt.sh argument1 argument2
W wyniku działania tego skryptu zostaną wyświetlone następujące komunikaty:
yamlCopy codeNazwa skryptu: ./skrypt.sh
Pierwszy argument: argument1
Drugi argument: argument2
Argumenty wiersza poleceń są przydatne do dostarczania danych do skryptów, co pozwala na ich dostosowywanie do różnych zadań lub przetwarzanie różnych zbiorów danych. Są one używane do przekazywania informacji i opcji do skryptów w sposób dynamiczny.
Zmienne specjalne
$0: Przechowuje nazwę skryptu lub programu, który jest aktualnie wykonywany. Jest to nazwa pliku wykonywalnego.
$1, $2, $3, ...: Przechowują argumenty wiersza poleceń przekazane przy uruchamianiu skryptu.
$1to pierwszy argument,$2to drugi argument, itd.$#: Przechowuje liczbę argumentów wiersza poleceń przekazanych do skryptu.
$@: Przechowuje listę wszystkich argumentów wiersza poleceń jako pojedynczy ciąg znaków.
$*: Przechowuje listę wszystkich argumentów wiersza poleceń jako pojedynczy ciąg znaków, ale zachowuje oryginalne odstępy między argumentami.
$?: Przechowuje kod powrotu ostatniej wykonanej komendy. Jeśli kod powrotu wynosi 0, oznacza to sukces, w przeciwnym razie wystąpił błąd.
$$: Przechowuje identyfikator procesu (PID) skryptu lub programu.
$!: Przechowuje PID ostatniego uruchomionego w tle procesu.
$IFS: Przechowuje separator pól (domyślnie spacje, tabulatory i nowe linie), który jest używany do dzielenia danych na pola w operacjach na ciągach znaków.
$HOME: Przechowuje ścieżkę do katalogu domowego bieżącego użytkownika.
$PWD: Przechowuje bieżący katalog roboczy (ścieżkę) skryptu.
$USER: Przechowuje nazwę bieżącego użytkownika.
$HOSTNAME: Przechowuje nazwę hosta, na którym jest uruchomiony skrypt.
Zmienne specjalne są używane do uzyskiwania informacji o środowisku, w którym działa skrypt, oraz do przetwarzania danych wejściowych i wyjściowych. Pozwala to na bardziej elastyczne i dynamiczne działanie skryptów, ponieważ można dostosować ich zachowanie na podstawie tych zmiennych.
Polecenia warunkowe
Polecenia warunkowe w Bashu pozwalają na kontrolowanie przebiegu skryptu w zależności od spełnienia określonych warunków. Najczęściej używane polecenia warunkowe to if, elif (else if) i else.
Składnia polecenia if:
bashCopy codeif [ warunek ]; then
# Wykonaj, jeśli warunek jest spełniony
fi
Przykład użycia polecenia if:
bashCopy code # Sprawdź, czy liczba jest większa od 10
liczba=15
if [ $liczba -gt 10 ]; then
echo "Liczba jest większa od 10."
fi
Składnia polecenia if z else:
bashCopy codeif [ warunek ]; then
# Wykonaj, jeśli warunek jest spełniony
else
# Wykonaj, jeśli warunek nie jest spełniony
fi
Przykład użycia polecenia if z else:
bashCopy code # Sprawdź, czy liczba jest parzysta lub nieparzysta
liczba=7
if [ $((liczba % 2)) -eq 0 ]; then
echo "Liczba jest parzysta."
else
echo "Liczba jest nieparzysta."
fi
Składnia polecenia if z elif:
bashCopy codeif [ warunek1 ]; then
# Wykonaj, jeśli warunek1 jest spełniony
elif [ warunek2 ]; then
# Wykonaj, jeśli warunek2 jest spełniony
else
# Wykonaj, jeśli żaden z warunków nie jest spełniony
fi
Przykład użycia polecenia if z elif:
bashCopy code# Sprawdź, czy liczba jest dodatnia, ujemna lub równa zeru
liczba=-5
if [ $liczba -gt 0 ]; then
echo "Liczba jest dodatnia."
elif [ $liczba -lt 0 ]; then
echo "Liczba jest ujemna."
else
echo "Liczba jest równa zeru."
fi
Polecenia warunkowe pozwalają na tworzenie bardziej zaawansowanych skryptów, które dostosowują swoje działanie w zależności od różnych warunków i danych wejściowych. Są one nieodłącznym elementem wielu skryptów Bash i umożliwiają podejmowanie decyzji na podstawie logicznych warunków.
Pętle
Pętle w Bashu pozwalają na wielokrotne wykonywanie określonych poleceń lub bloków kodu w zależności od spełnienia określonych warunków. Bash obsługuje kilka rodzajów pętli, w tym pętlę for, pętlę while i pętlę until.
Pętla for:
Pętla for pozwala na iterację przez listę elementów i wykonanie określonych operacji dla każdego elementu.
Składnia pętli for:
bashCopy codefor zmienna in element1 element2 element3
do
# Kod do wykonania
done
Przykład użycia pętli for:
bashCopy code# Iteracja przez listę kolorów
kolory=("czerwony" "zielony" "niebieski")
for kolor in "${kolory[@]}"
do
echo "Kolor: $kolor"
done
Pętla while:
Pętla while wykonuje określony blok kodu tak długo, jak długo podany warunek jest spełniony.
Składnia pętli while:
bashCopy codewhile warunek
do
# Kod do wykonania
done
Przykład użycia pętli while:
bashCopy code# Pętla wyświetla liczby od 1 do 5
licznik=1
while [ $licznik -le 5 ]
do
echo "Liczba: $licznik"
licznik=$((licznik + 1))
done
Pętla until:
Pętla until działa podobnie do pętli while, ale wykonuje określony blok kodu, dopóki warunek nie zostanie spełniony.
Składnia pętli until:
bashCopy codeuntil warunek
do
# Kod do wykonania
done
Przykład użycia pętli until:
bashCopy code# Pętla wyświetla liczby od 1 do 5
licznik=1
until [ $licznik -gt 5 ]
do
echo "Liczba: $licznik"
licznik=$((licznik + 1))
done
Pętle w Bashu są używane do automatyzacji zadań, które wymagają wielokrotnego powtarzania operacji. Mogą być również wykorzystywane do przetwarzania danych w plikach, zarządzania listami, analizy danych i wielu innych zastosowań. Pętle pozwalają na bardziej efektywne i elastyczne programowanie w Bashu.
Funkcje
Funkcje w Bashu pozwalają na zorganizowanie kodu w modularny sposób, dzięki czemu można wielokrotnie używać tych samych fragmentów kodu bez konieczności ich powtarzania. Funkcje są szczególnie przydatne w bardziej rozbudowanych skryptach, które wymagają strukturyzacji i odseparowania różnych części logicznych.
Deklaracja funkcji:
bashCopy codenazwa_funkcji() {
# Kod funkcji
}
Wywołanie funkcji:
bashCopy codenazwa_funkcji
Przykład deklaracji i wywołania funkcji:
bashCopy code# Deklaracja funkcji
witaj() {
echo "Witaj, to jest funkcja!"
}
# Wywołanie funkcji
witaj
W wyniku działania tego skryptu zostanie wyświetlony komunikat: "Witaj, to jest funkcja!".
Funkcje w Bashu mogą również przyjmować argumenty, co pozwala na przekazywanie danych do funkcji. Oto przykład funkcji przyjmującej argumenty:
bashCopy code# Funkcja przyjmująca argumenty
przedstaw_sie() {
imie=$1
wiek=$2
echo "Cześć, jestem $imie i mam $wiek lat."
}
# Wywołanie funkcji z argumentami
przedstaw_sie "Jan" 30
W wyniku działania tego skryptu zostanie wyświetlony komunikat: "Cześć, jestem Jan i mam 30 lat.".
Funkcje pozwalają na:
Organizowanie kodu w bardziej czytelny sposób.
Unikanie powtarzania tych samych operacji w wielu miejscach skryptu.
Tworzenie modułów lub bibliotek funkcji do wielokrotnego użycia.
Przekazywanie i przetwarzanie danych wewnątrz funkcji.
Wywoływanie funkcji w zależności od potrzeb w trakcie działania skryptu.
Funkcje stanowią ważny element programowania w Bashu i pomagają w tworzeniu bardziej efektywnych i zorganizowanych skryptów.
Obsługa błędów
Obsługa błędów w Bashu jest istotnym aspektem tworzenia niezawodnych skryptów. Pozwala na identyfikowanie i reagowanie na nieoczekiwane sytuacje, takie jak błędy wykonania komend lub niepowodzenia w trakcie wykonywania skryptu. W Bashu można obsługiwać błędy przy użyciu mechanizmów takich jak sprawdzanie kodów powrotu i ustawianie pułapek (trap).
Sprawdzanie kodów powrotu:
Każda komenda lub polecenie wykonywane w Bashu zwraca kod powrotu (exit code), który informuje o wyniku jego wykonania. Domyślnie kod 0 oznacza sukces, a wartości różne od 0 oznaczają błąd. Można sprawdzać te kody, aby obsługiwać błędy w skrypcie.
Przykład użycia sprawdzania kodów powrotu:
bashCopy code# Sprawdzenie, czy plik istnieje
if [ -e "plik.txt" ]; then
echo "Plik istnieje."
else
echo "Plik nie istnieje."
fi
W tym przykładzie używamy [ -e "plik.txt" ], aby sprawdzić, czy plik "plik.txt" istnieje. Jeśli tak, wyświetlamy komunikat "Plik istnieje", w przeciwnym razie wyświetlamy "Plik nie istnieje".
Ustawianie pułapek (trap):
Pułapki (traps) pozwalają na reagowanie na sygnały systemowe lub błędy w trakcie działania skryptu. Można ustawić pułapki, które będą wykonywały określone operacje, gdy wystąpią określone sytuacje, takie jak przerwanie (CTRL+C) lub błąd wykonania komendy.
Przykład użycia pułapki na przerwanie (CTRL+C):
bashCopy code# Ustawienie pułapki na sygnał SIGINT (CTRL+C)
trap 'echo "Skrypt został przerwany"; exit' INT
# Nieskończona pętla
while true
do
sleep 1
done
W tym przykładzie ustawiamy pułapkę, która wyświetli komunikat "Skrypt został przerwany" i zakończy skrypt, gdy zostanie przerwany przy użyciu klawisza CTRL+C.
Obsługa błędów jest istotnym aspektem tworzenia niezawodnych skryptów w Bashu. Pozwala to na zapewnienie poprawnego działania skryptu nawet w przypadku nieoczekiwanych sytuacji, takich jak brak dostępu do pliku, błąd wykonania komendy lub przerwanie użytkownika.