Generator skryptu bash
Szkielet skryptu z obsługą argumentów i logowaniem
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator skryptu bash — dobry start bez błędów
Wiele skryptów bash ma te same problemy: brak obsługi błędów, brak logowania i nieczytelna obsługa argumentów. Ten generator tworzy poprawny szkielet, który łatwo rozbudować.
Co zawiera szkielet?
| Element | Rola |
|---|---|
#!/usr/bin/env bash | przenośny shebang |
set -euo pipefail | przerywanie przy błędach i niezdefiniowanych zmiennych |
log() | spójne komunikaty z datą |
usage() | komunikat pomocy i kod wyjścia |
main() | punkt wejścia i czytelna struktura |
Dobre praktyki
- Zawsze cytuj zmienne:
"$zmienna", żeby uniknąć problemów ze spacjami. - Używaj
[[ ]]zamiast[ ]— bezpieczniejsze porównania. - Sprawdzaj istnienie plików przed ich użyciem (
[[ -f "$plik" ]]). - Logi kieruj na
stderr, a dane nastdout. - Ustawiaj kody wyjścia: 0 = sukces, 1+ = błąd.
Jak działa generator skryptu bash
Generator nie uruchamia żadnego kodu i nie wysyła niczego na serwer — całość dzieje się w przeglądarce. Jego działanie sprowadza się do złożenia tekstu skryptu z gotowych bloków: nagłówka, definicji funkcji i sekcji obsługi argumentów. Każda opcja, którą zaznaczysz, włącza albo wyłącza konkretny fragment, a wynik dostajesz jako zwykły tekst — do skopiowania albo zapisania w pliku z rozszerzeniem .sh.
Kolejność bloków nie jest przypadkowa, bo odpowiada kolejności wykonywania. Shebang musi stać w pierwszej linii, bo to on decyduje o interpreterze. Zaraz po nim wchodzi set -euo pipefail — zanim wykona się jakiekolwiek polecenie, które mogłoby zawieść. Dopiero dalej definiowane są stałe i funkcje pomocnicze, a na samym końcu funkcja main oraz jej wywołanie z przekazaniem argumentów. Dzięki tej kolejności main korzysta wyłącznie z funkcji, które już istnieją.
Rozdzielenie strumieni wynika z konwencji, nie z magii interpretera: komunikaty diagnostyczne idą na stderr, a właściwe dane na stdout. Przekierowanie wyniku do pliku nie zaśmieca go wtedy logami, a użytkownik nadal widzi komunikaty na ekranie. Funkcja usage() wypisuje pomoc i kończy pracę niezerowym kodem, więc błędne wywołanie da się odróżnić od błędu działania skryptu choćby w skryptach nadrzędnych.
Przykład krok po kroku: od formularza do działającego skryptu
- W polu nazwy wpisujesz backup.sh, a w opisie jedno zdanie, na przykład „kopiuje wskazane pliki”. Opis trafia później do komentarza nagłówkowego i do komunikatu pomocy.
- Zaznaczasz opcje: tryb ścisły, logowanie z datą i obsługę argumentów z funkcją usage(). Generator składa z tych wyborów jeden spójny tekst, bez duplikatów i bez pustych miejsc.
- Kopiujesz wynik do pliku backup.sh i nadajesz mu prawo wykonywania poleceniem chmod +x backup.sh. Od tego momentu uruchamiasz go jako ./backup.sh.
- Wywołanie bez argumentów: $# wynosi 0, warunek [[ $# -lt 1 ]] jest prawdziwy, więc usage() wypisuje pomoc i kończy pracę kodem 2 — to typowy kod dla błędnego wywołania.
- Wywołanie z jednym argumentem wskazującym na nieistniejący plik: $# wynosi 1, sprawdzenie [[ -f "$1" ]] jest fałszywe, log() wypisuje komunikat błędu na stderr, a skrypt kończy się kodem 1.
- To samo wywołanie ze ścieżką do istniejącego pliku: warunek jest prawdziwy, log() potwierdza wykonanie, a skrypt kończy pracę kodem 0, czyli sukcesem. Ten sam plik zachowuje się identycznie przy kolejnych uruchomieniach, bo nie zależy od stanu przeglądarki.
Konstrukcje bash w szkielecie — ściągawka
| Element | Co robi | Na co uważać |
|---|---|---|
| set -e | przerywa skrypt także w środku funkcji | nie działa w warunkach if, while ani po operatorze || — tam błąd trzeba obsłużyć jawnie |
| set -u | dotyczy również parametrów funkcji i zmiennych pozycyjnych | zapis ${zmienna:-} podaje wartość domyślną i wyłącza kontrolę w tym jednym miejscu |
| set -o pipefail | zmienia sposób oceny całego potoku | bez tej opcji liczy się wyłącznie kod ostatniej komendy, wcześniejsze błędy znikają |
| "$@" | przekazuje argumenty jeden do jednego, z zachowaniem cudzysłowów | "$*" skleja je w jeden łańcuch — efekt bywa inny, niż zakładasz |
| [[ ... ]] | porównania i dopasowanie wzorców w bashu | nie jest przenośne do sh ani dash, dlatego shebang musi wskazywać bash |
| local | ogranicza zasięg zmiennej do funkcji | poza funkcją zwraca błąd, a w sh nie istnieje |
| trap | reakcja na sygnał albo na zakończenie skryptu | trzeba samemu wskazać, co ma zostać posprzątane, np. pliki tymczasowe |
Jak korzystać z gotowego szkieletu
- Zapisuj wynik od razu do pliku .sh — wklejanie kodu przez schowek do edytora bez zapisu na dysk kończy się zwykle utratą formatowania i mieszaniem znaków nowej linii.
- Nie usuwaj funkcji main() — trzymanie logiki w jednym miejscu i wywołanie jej na końcu pozwala dopisać do skryptu kolejny krok bez przebudowy całości.
- Rozbudowuj o jedną funkcję naraz — po każdej zmianie uruchom skrypt na kopii danych, żeby wiedzieć, która modyfikacja wprowadziła błąd.
- Sprawdzaj składnię przed uruchomieniem — polecenie bash -n skrypt.sh wykryje literówki i niedomknięte cudzysłowy, zanim skrypt zdąży coś nadpisać.
- Trzymaj się kodów wyjścia — jeśli dodajesz własne zakończenia, używaj 0 dla sukcesu i wartości od 1 w górę dla błędów, inaczej skrypt nadrzędny nie odróżni sytuacji.
Ograniczenia i pułapki
- To szkielet, nie gotowy program — generator nie wie, co ma robić twoje narzędzie. Daje poprawną strukturę i obsługę błędów, ale właściwą logikę dopisujesz sam.
- Zakłada powłokę bash — wygenerowany kod korzysta z konstrukcji, których sh i dash nie znają. Przenoszenie go do innych powłok wymaga przepisania testów i obsługi argumentów.
- Nie weryfikuje logiki — poprawny składniowo skrypt może robić coś odwrotnego, niż zamierzałeś. Kolejność kroków i warunki sprawdzasz sam, najlepiej na kopii danych.
- Nie zarządza sekretami — szkielet nie zawiera odczytu haseł, kluczy ani plików chronionych. Wartości wrażliwych nie wpisuj w treść skryptu, bo trafią do historii wersji i do listy procesów.
Najczęstsze pytania
Co robi set -euo pipefail?
-e przerywa przy błędzie, -u zgłasza użycie niezdefiniowanej zmiennej, a pipefail zwraca błąd, gdy którykolwiek element potoku zawiedzie.
Jak debugować skrypt?
Uruchom z bash -x skrypt.sh albo dodaj set -x na początku — zobaczysz każdą wykonywaną komendę.
Czy skrypt będzie działał pod sh?
Nie zawsze — konstrukcje bash (np. [[ ]]) nie są przenośne do sh. Shebang wymusza uruchomienie przez bash.
Jak napisać prosty skrypt bash?
Zacznij od shebang, dodaj set -euo pipefail, zdefiniuj funkcję main i wywołaj ją na końcu z przekazaniem argumentów. Taki szkielet tworzy generator — zostaje dopisać właściwą logikę.
Jak uruchomić skrypt bash?
Nadaj plikowi prawo wykonywania przez chmod +x i uruchom go jako ./skrypt.sh. Możesz też pominąć ten krok i wywołać interpreter bezpośrednio: bash skrypt.sh.
Jak przekazać argumenty do skryptu bash?
Argumenty podajesz po nazwie skryptu, na przykład ./skrypt.sh arg1 arg2. W środku odczytujesz je jako $1, $2 i dalej, liczbę sprawdzasz przez $#, a całość przekazujesz funkcjom jako "$@".
Jak sprawdzić, czy plik istnieje w bash?
Użyj testu [[ -f "$plik" ]] dla zwykłego pliku albo [[ -d "$katalog" ]] dla katalogu. Cudzysłowy wokół zmiennej są konieczne, inaczej ścieżka ze spacją rozsypie porównanie.
Po co jest funkcja main w skrypcie bash?
Daje jednolity punkt wejścia i porządkuje kolejność definicji — najpierw funkcje pomocnicze, na końcu właściwa praca. Łatwiej wtedy dodać obsługę argumentów, sprzątanie po błędzie albo test całego przepływu.