Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

Generator skryptu Bash

Strict mode, obsługa błędów, logowanie, argumenty z --dry-run oraz gotowe zadania: kopia zapasowa i czyszczenie plików

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  return "Wynik gotowy w 0.1s";
}
Parametry kopii i czyszczenia

Kopia: katalog źródłowy, archiwa trafiają do /var/backups/<nazwa>. Czyszczenie: katalog, z którego usuwamy stare pliki.

Zmieniłeś ustawienia. Kliknij „Generuj skrypt”, aby odświeżyć wynik.

Liczba linii

87

Rozmiar

1 868 B

Funkcje

5

Ochrona przed błędami

pełna
OK

set -Eeuo pipefail + trap ERR

deploy.sh

#!/usr/bin/env bash # Skrypt wdrożeniowy # Użycie: ./deploy.sh [OPCJE] set -Eeuo pipefail IFS=$'\n\t' # Konfiguracja (każdą wartość można nadpisać zmienną środowiskową) readonly LOG_FILE="${LOG_FILE:-/var/log/deploy.log}" log() { local level="$1"; shift local line line="$(date +'%Y-%m-%d %H:%M:%S') [$level] $*" printf '%s\n' "$line" >&2 { printf '%s\n' "$line" >> "$LOG_FILE"; } 2>/dev/null || true } on_error() { local exit_code="$1" line="$2" trap - ERR log ERROR "Skrypt przerwany błędem (kod: $exit_code, linia: $line)" exit "$exit_code" } trap 'on_error "$?" "$LINENO"' ERR usage() { cat <<EOF Użycie: $(basename "$0") [OPCJE] -e, --environment ENV Środowisko (dev|staging|prod) -n, --dry-run Pokaż polecenia bez wykonywania -v, --verbose Tryb gadatliwy (set -x) -h, --help Pomoc EOF } ENVIRONMENT="dev" DRY_RUN=false VERBOSE=false while [[ $# -gt 0 ]]; do case "$1" in -e|--environment) if [[ $# -lt 2 ]]; then log ERROR "Opcja $1 wymaga wartości" usage >&2; exit 1 fi ENVIRONMENT="$2"; shift 2 ;; -n|--dry-run) DRY_RUN=true; shift ;; -v|--verbose) VERBOSE=true; shift ;; -h|--help) usage; exit 0 ;; *) log ERROR "Nieznana opcja: $1" usage >&2; exit 1 ;; esac done case "$ENVIRONMENT" in dev|staging|prod) ;; *) log ERROR "Nieznane środowisko: $ENVIRONMENT (dozwolone: dev, staging, prod)" exit 1 ;; esac if [[ "$VERBOSE" == true ]]; then set -x fi run() { if [[ "$DRY_RUN" == true ]]; then log INFO "[dry-run] $(printf '%q ' "$@")" else "$@" fi } main() { log INFO "Start: $0 (środowisko: ${ENVIRONMENT:-default})" # TODO: zaimplementuj logikę for i in $(seq 1 3); do log INFO "Krok $i/3" sleep 1 done log INFO "Zakończono pomyślnie" } main "$@"
Zadanie: Pętla przykładowa

Jak uruchomić

chmod +x deploy.sh bash -n deploy.sh # kontrola składni bez uruchamiania ./deploy.sh -e prod

Ściąga: bezpieczny skrypt Bash

Najważniejsze elementy z wygenerowanego szkieletu
PolecenieCo robiNa co uważać
set -e Przerywa skrypt, gdy polecenie zwróci kod różny od 0 Nie działa w warunku if/while ani w listach && / || (poza ostatnim poleceniem)
set -u Błąd przy użyciu nieustawionej zmiennej Dla opcjonalnych zmiennych pisz ${ZMIENNA:-domyślna}
set -o pipefail Potok kończy się błędem, gdy zawiedzie dowolne polecenie w potoku Bez tego liczy się tylko kod ostatniego polecenia
set -E Funkcje dziedziczą pułapkę trap … ERR Bez tego błąd w funkcji (np. main) omija on_error
IFS=$'\n\t' Dzieli niecytowane rozwinięcia tylko na nowej linii i tabulatorze Spacje w nazwach plików nie rozbijają pętli for
trap … EXIT Uruchamia sprzątanie przy każdym zakończeniu skryptu Dobre miejsce na usunięcie katalogu tymczasowego
flock -n 9 Blokada: druga kopia skryptu kończy się od razu Chroni zadania z crona przed nakładaniem się
command -v tar Sprawdza, czy polecenie jest dostępne Wbudowane w powłokę, przenośniejsze niż which
bash -n plik.sh Sprawdza składnię bez uruchamiania Nie wykryje błędów logicznych

Kolejność w szkielecie

Najpierw tryb strict, potem konfiguracja w zmiennych (każdą nadpiszesz, np. RETENTION_DAYS=30 ./backup.sh), funkcja log, pułapka błędów, argumenty i dopiero main. Dzięki temu błąd w dowolnym miejscu jest zalogowany z numerem linii, a skrypt nie wykonuje dalszych kroków.

Typowe pułapki

Cron uruchamia skrypt z okrojonym PATH (zwykle /usr/bin:/bin), więc podawaj pełne ścieżki. find -mtime +7 łapie pliki zmienione co najmniej 8 pełnych dób temu, bo find obcina ułamki doby. Zmienne zawsze w cudzysłowach: "$PLIK", inaczej spacja w nazwie rozbije polecenie.

Przed pierwszym uruchomieniem

Sprawdź składnię: bash -n skrypt.sh, a jeśli masz ShellCheck, przepuść przez niego plik. Zadania, które usuwają pliki, uruchom najpierw z --dry-run: skrypt wypisze polecenia zamiast je wykonać. Testuj na kopii danych, nie na produkcji.

Oceń to narzędzie:

Powiązane narzędzia

Inne narzędzia, które mogą Ci się przydać

Generator skryptu Bash

Dobry skrypt Bash zaczyna się od shebanga i trybu strict, ma logowanie, obsługę błędów i bezpieczne parsowanie argumentów. Ten generator składa gotowy szkielet z tymi elementami, a w funkcji main wstawia jedno z czterech zadań: pętlę przykładową, kopię zapasową katalogu do archiwum tar.gz z rotacją, usuwanie plików starszych niż N dni albo pusty szablon pod własną logikę.

Elementy skryptu

ElementZnaczenie
set -Eeuo pipefailprzerwij przy błędzie, nieustawionej zmiennej i w potoku; -E przekazuje pułapkę ERR do funkcji
trap ERRprzechwycenie błędu i wpis z kodem wyjścia oraz numerem linii
log()komunikaty z datą na stderr i do pliku LOG_FILE
while + caseopcje -e/--environment, -n/--dry-run, -v/--verbose, -h/--help
run()w trybie --dry-run wypisuje polecenie zamiast je wykonać
command -vsprawdza, czy wymagane polecenia (np. rsync, jq) są zainstalowane
flock -n 9opcjonalna blokada przed uruchomieniem drugiej kopii skryptu
EUIDopcjonalne przerwanie, gdy skrypt nie działa jako root
mktemp -d + trap EXITopcjonalny katalog tymczasowy usuwany przy każdym wyjściu

Szablony „Wdrożenie”, „Kopia zapasowa” i „Czyszczenie plików” ustawiają jednym kliknięciem nazwę pliku, opis, zadanie, katalog i liczbę dni. Ścieżki i retencja trafiają do zmiennych readonly na górze skryptu, a każdą z nich nadpiszesz przy uruchomieniu, np. RETENTION_DAYS=30 ./backup.sh.

Przykład

Początek i koniec szkieletu z domyślnymi ustawieniami (szablon „Wdrożenie”). Pierwsza linia to shebang wskazujący /usr/bin/env bash, dalej:

# Skrypt wdrożeniowy
set -Eeuo pipefail
IFS=$'\n\t'
readonly LOG_FILE="${LOG_FILE:-/var/log/deploy.log}"
…
main() {
log INFO "Start: $0 (środowisko: ${ENVIRONMENT:-default})"
# TODO: zaimplementuj logikę
…
}
main "$@"

Uruchomienie

Po zapisaniu nadaj prawa wykonywania: chmod +x skrypt.sh, sprawdź składnię bez uruchamiania: bash -n skrypt.sh, a następnie uruchom ./skrypt.sh --help. Generator pokazuje te polecenia z nazwą twojego pliku, a przy kopii i czyszczeniu dodaje przykładowy wpis crona na 3:00.

Jak składa się wygenerowany skrypt

Generator nie wykonuje żadnego polecenia i nie analizuje twojej logiki. To składacz tekstu: wybrane bloki trafiają do wyniku w ustalonej kolejności — shebang z komentarzem, tryb strict i IFS, konfiguracja w zmiennych, funkcja log, trap ERR, katalog tymczasowy, obsługa argumentów, funkcja main i na końcu jej wywołanie. Nad kodem widzisz liczbę linii, rozmiar w bajtach, liczbę funkcji i ocenę ochrony przed błędami: „pełna” wymaga jednocześnie trybu strict i trap ERR.

Kolejność bloków nie jest przypadkowa. Funkcja log musi być zdefiniowana, zanim cokolwiek może zawieść, bo korzysta z niej procedura on_error wywoływana przez trap ERR. Wywołanie main "$@" musi znaleźć się na samym końcu, bo powłoka czyta plik od góry do dołu i w chwili wywołania wszystkie funkcje muszą już istnieć. Argumenty są czytane wcześniej, poza main: pętla while z case zdejmuje je poleceniem shift i zapisuje w zmiennych ENVIRONMENT, DRY_RUN i VERBOSE, z których korzysta dalsza część skryptu.

Tryb strict działa globalnie, od miejsca włączenia do końca pliku. set -e przerywa pracę po pierwszym poleceniu z niezerowym kodem, set -u zgłasza błąd przy odwołaniu do niezdefiniowanej zmiennej, a set -o pipefail sprawia, że potok kończy się błędem, gdy zawiedzie którekolwiek polecenie, a nie tylko ostatnie (zwracany jest kod ostatniego polecenia, które zawiodło). Gdy zaznaczysz trap ERR, generator dopisuje też -E, bez którego pułapka nie zadziałałaby wewnątrz funkcji, czyli w całym main.

Przykład krok po kroku

  1. Klikasz szablon „Kopia zapasowa”. Generator ustawia plik backup.sh, katalog źródłowy /var/www/html i retencję 7 dni. Przy domyślnych opcjach wynik ma ponad sto linii, a w main zamiast komentarza TODO stoją gotowe polecenia mkdir, tar i find.
  2. Pobierasz plik i nadajesz mu prawo wykonywania poleceniem chmod +x backup.sh. Bez tego kroku powłoka odmówi uruchomienia pliku przez ./ i pozostanie wywołanie bash backup.sh.
  3. Uruchamiasz ./backup.sh --help. Parser trafia w gałąź -h, wypisuje sposób użycia i kończy pracę kodem 0 — żadna operacja na danych nie zostaje wykonana.
  4. Uruchamiasz ./backup.sh --dry-run. Skrypt sprawdza, czy w systemie są tar, gzip i find, a potem funkcja run zamiast wykonać mkdir, tar i find wypisuje je jako wpisy [dry-run]. Nic nie powstaje i nic nie znika.
  5. Uruchamiasz ./backup.sh -e prod. Powstaje archiwum w rodzaju /var/backups/backup/html-20261021-030000.tar.gz, a find usuwa archiwa tego katalogu starsze niż RETENTION_DAYS dni. Nieznana opcja kończy skrypt kodem 1 i wypisuje pomoc, środowisko spoza dev, staging i prod też daje kod 1.
  6. Jeśli któreś polecenie zawiedzie, na przykład tar nie może odczytać części plików, set -e przerywa skrypt, a trap ERR zapisuje wpis ERROR z kodem wyjścia i numerem linii. Skrypt kończy pracę tym samym kodem, więc cron albo CI widzą niepowodzenie.

Co robi każdy element szkieletu

Fragment szkieletuRola w działaniu skryptuSkutek pominięcia
shebang /usr/bin/env bashwybiera interpreter na podstawie zmiennej PATHuruchomienie przez sh grozi błędami składni, bo sh bywa inną powłoką
set -eprzerywa skrypt po pierwszym niezerowym kodzie poleceniaskrypt brnie dalej i wykonuje kolejne kroki na błędnych danych
set -uzgłasza błąd przy użyciu niezdefiniowanej zmiennejliterówka w nazwie zmiennej podstawia pusty tekst zamiast błędu
set -o pipefailpotok kończy się błędem, gdy zawiedzie dowolne jego poleceniebłąd w środku potoku zostaje zamaskowany przez ostatnie polecenie
set -Eprzekazuje pułapkę ERR do funkcjibłąd wewnątrz main nie uruchomi on_error i nie trafi do logu
IFS=$'\n\t'ustala separator pól na nową linię i tabulatorspacje w nazwach plików rozbijają argumenty na części
trap ERRuruchamia procedurę obsługi błędu i dopisuje numer liniilog nie mówi, w którym miejscu skrypt się zatrzymał
--dry-run i run()wypisuje polecenia zamiast je wykonywaćpierwszy test kopii lub czyszczenia odbywa się na żywych danych
main "$@"uruchamia główną logikę po zdefiniowaniu wszystkich funkcjiskrypt definiuje funkcje, ale nic nie robi
chmod +xnadaje plikowi prawo wykonywaniaplik uruchomisz tylko przez bash skrypt.sh, nie przez ./skrypt.sh

Praktyczne wskazówki

  • Uruchom skrypt z opcją --help, zanim go rozbudujesz. Sprawdzisz, czy parser argumentów działa.
  • Całą logikę trzymaj w main. Poza nią zostaw definicje funkcji i ustawienia globalne, a nowe polecenia, które zmieniają dane, poprzedzaj słowem run — wtedy --dry-run obejmie także je.
  • Sprawdź, gdzie trafia log. Domyślny LOG_FILE to /var/log/<nazwa>.log; zwykły użytkownik zwykle nie ma tam prawa zapisu, a szkielet celowo wycisza ten błąd, więc komunikaty pojawią się tylko na stderr. Uruchom skrypt przez sudo albo podaj np. LOG_FILE="$HOME/backup.log".
  • Testuj na kopii danych. Tryb strict potrafi zatrzymać skrypt w połowie serii operacji, więc pierwsze uruchomienie po --dry-run zrób na katalogu roboczym.
  • Nie mieszaj kodu z konfiguracją. Szkielet zbiera ścieżki i retencję w zmiennych na górze pliku; własne progi i nazwy dopisuj w tym samym miejscu, a nie w środku funkcji.

Ograniczenia generatora

  • Nie zna twojej logiki. Poza kopią zapasową i czyszczeniem narzędzie dostarcza wyłącznie szkielet, a resztę dopisujesz w miejscu oznaczonym jako TODO.
  • Nie sprawdza składni po twojej edycji. Generator zwraca tekst i go nie uruchamia; błąd wyłapiesz poleceniem bash -n albo dopiero przy starcie skryptu.
  • Ma stały zestaw opcji. Parser obsługuje -e, -n, -v i -h, a środowisko przyjmuje tylko dev, staging i prod. Inne przełączniki dopisujesz w pętli case i w funkcji usage.
  • Pilnuje ścieżek. Katalog musi być ścieżką bezwzględną bez spacji i „..”, retencja liczbą od 1 do 3650 dni, a wymaganych poleceń może być najwyżej 15. Czyszczenia nie ustawisz na / ani na katalogi systemowe, takie jak /etc, /var czy /home — trzeba wskazać podkatalog.
  • Celuje w bash na Linuksie. W sh lub zsh skrypt może zachowywać się inaczej, a blokada flock wymaga pakietu util-linux.

Najczęstsze pytania

Po co IFS w skrypcie Bash?

Ustawia separator pól na nową linię i tabulator, więc spacja w nazwie pliku nie rozbija pętli for ani niecytowanych rozwinięć. Nie zastępuje cudzysłowów wokół zmiennych.

Czym jest trap w Bash?

To procedura uruchamiana przy błędzie (ERR) lub przy wyjściu ze skryptu (EXIT). W szkielecie trap ERR loguje kod i linię błędu, a trap EXIT usuwa katalog tymczasowy z mktemp.

Czy skrypt działa na macOS?

Tak, bo shebang wskazuje /usr/bin/env bash, a szkielet nie korzysta z funkcji basha 4. Polecenia flock macOS domyślnie nie ma, więc opcję blokady wyłącz albo doinstaluj flock.

Jak uruchomić skrypt Bash?

Zapisz wynik w pliku .sh, nadaj mu prawo wykonywania i uruchom przez ./nazwa.sh. Bez nadawania praw zadziała wywołanie przez interpreter, czyli bash nazwa.sh.

Czy tryb strict zawsze powinien być włączony?

W skryptach automatyzujących prawie zawsze tak, bo szybciej ujawnia błąd niż ciche przejście do kolejnego kroku. Polecenie, które może legalnie zawieść, zapisz jako polecenie || true albo sprawdź w warunku if.

Jak przekazać argumenty do skryptu Bash?

Podajesz je po nazwie pliku, np. ./deploy.sh -e staging --dry-run. Pętla case rozpoznaje -e, -n, -v i -h, a każdy inny argument kończy skrypt kodem 1 z opisem użycia.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!