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/bash

Ten 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:

  1. Utworzenie skryptu Bash: Utwórzmy prosty skrypt Bash o nazwie hello.sh, który wyświetli powitanie:

    bashCopy code#!/bin/bash
    echo "Witaj, świecie!"
  2. Nadanie praw do wykonania: Aby móc uruchomić ten skrypt, nadajmy mu prawa do wykonania:

    bashCopy codechmod +x hello.sh
  3. Uruchomienie skryptu: Teraz możemy uruchomić skrypt za pomocą polecenia:

    bashCopy code./hello.sh

    Dzię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:

  1. 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))
    
  2. Konkatenacja łańcuchów: Możesz konkatenować łańcuchy tekstowe, używając + lub +=.

    bashCopy codeimie="Jan"
    nazwisko="Kowalski"
    pelne_imie="$imie $nazwisko"
    
  3. 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 $1 to pierwszy argument, $2 to 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

  1. $0: Przechowuje nazwę skryptu lub programu, który jest aktualnie wykonywany. Jest to nazwa pliku wykonywalnego.

  2. $1, $2, $3, ...: Przechowują argumenty wiersza poleceń przekazane przy uruchamianiu skryptu. $1 to pierwszy argument, $2 to drugi argument, itd.

  3. $#: Przechowuje liczbę argumentów wiersza poleceń przekazanych do skryptu.

  4. $@: Przechowuje listę wszystkich argumentów wiersza poleceń jako pojedynczy ciąg znaków.

  5. $*: Przechowuje listę wszystkich argumentów wiersza poleceń jako pojedynczy ciąg znaków, ale zachowuje oryginalne odstępy między argumentami.

  6. $?: Przechowuje kod powrotu ostatniej wykonanej komendy. Jeśli kod powrotu wynosi 0, oznacza to sukces, w przeciwnym razie wystąpił błąd.

  7. $$: Przechowuje identyfikator procesu (PID) skryptu lub programu.

  8. $!: Przechowuje PID ostatniego uruchomionego w tle procesu.

  9. $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.

  10. $HOME: Przechowuje ścieżkę do katalogu domowego bieżącego użytkownika.

  11. $PWD: Przechowuje bieżący katalog roboczy (ścieżkę) skryptu.

  12. $USER: Przechowuje nazwę bieżącego użytkownika.

  13. $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.