printf
- printf – narzędzie do formatowanego wypisywania danych na stdout, wzorowane na
printf(3)
z C. - Zastosowania: stabilne komunikaty logów, generowanie danych (w tym bajtów binarnych), precyzyjne formatowanie liczb, NUL‑separatory, kolorowanie terminala, przypisywanie do zmiennych (bash).
- Dostępne jako program GNU coreutils (
/usr/bin/printf
) oraz wbudowane polecenie wbash
,zsh
,ksh
(drobne różnice funkcji/rozszerzeń). Na systemach BSD/macOS również dostępne (z różnicami implementacyjnymi).
Składnia
Dział zatytułowany „Składnia”# GNU coreutilsprintf [OPCJE] FORMAT [ARG...]
# Bash/zsh builtin (dodatkowo)printf [-v ZMIENNA] FORMAT [ARG...]
FORMAT
zawiera specyfikatory konwersji (%s
,%d
,%.2f
,%%
, …) oraz sekwencje backslash w stylu C (\n
,\t
,\xHH
,\uXXXX
, …).- Argumenty
ARG
podstawiane są do kolejnych specyfikatorów; jeśli argumentów jest więcej niż konwersji, cykl się powtarza. printf
nie dodaje końcowego znaku nowej linii – jeśli chcesz nową linię, dodaj\n
w formacie.
Parametry
Dział zatytułowany „Parametry”Parametr | Opis |
---|---|
FORMAT | Łańcuch z literami i konwersjami: %% (znak % ), %s (łańcuch), %d/%i (liczba całkowita), %u (bez znaku), %o (ósemkowo), %x/%X (szesnastkowo), %f/%F (float), %e/%E , %g/%G , %c (pojedynczy znak), %b (interpretuj \ ‑escapy w argumencie – POSIX), %q (cytuj jak dla powłoki – rozszerzenie GNU/bash). |
Szerokość/prec. | %-10s (wyrównanie lewo), %10s (prawo), %08d (zero‑padding), %.2f (2 miejsca po przecinku), %*.*f (szerokość i precyzja z argumentów). |
Escapy | W formacie i dla %b : \n , \t , \r , \a , \v , \f , \\ , \0NNN , \xHH , \uXXXX , \UXXXXXXXX ; \e (ESC) – rozszerzenie GNU/bash; przenośne odpowiedniki to \033 lub \x1b . |
-v ZMIENNA | (bash/zsh) Zamiast pisać na stdout, zapisz wynik do zmiennej. |
--help , --version | (GNU) Pomoc / wersja programu. |
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 1) Łańcuch bez automatycznego nowego wierszaprintf 'Witaj świecie!\n'# Efekt: dokładnie jeden wiersz z \n na końcu.
# 2) Formatowanie liczb całkowitych i zerowe wypełnienieprintf 'ID=%08d\n' 42# Efekt: ID=00000042
# 3) Liczby zmiennoprzecinkowe z precyzją i szerokościąprintf '%8.3f\n' 3.14159 2.5# Efekt: 3.142\n 2.500
# 4) Kolorowanie komunikatu (ESC = \033); reset atrybutów na końcuprintf '\033[1;32mOK\033[0m\n'# Efekt: zielony pogrubiony napis „OK”.
# 5) NUL‑separatory (bezpiecznie dla wartości z nowymi liniami)printf '%s\0' "${lista[@]}" | xargs -0 -n1 echo# Efekt: każda pozycja przechodzi jako osobny argument do xargs.
# 6) Generowanie bajtów binarnych (pliki/test API)printf '\xDE\xAD\xBE\xEF' > frame.bin# Efekt: plik 4‑bajtowy 0xDEADBEEF.
# 7) Bash: zapis wyniku do zmiennej i cytowanie dla powłokiprintf -v quoted '%q' "$PWD"; echo "$quoted"# Efekt: ścieżka zapisana tak, by była bezpieczna jako argument shella.
# 8) Dynamiczna szerokość i precyzja z argumentówprintf '%*.*f\n' 10 4 2.718281828# Efekt: „ 2.7183” (szerokość 10, 4 miejsca po przecinku).
- Lepsze niż
echo
:echo
ma nieprzenośne zachowanie (-e
,-n
, interpretacja backslash). W skryptach preferujprintf
. - Locale a liczby: Formatowanie liczb (
%f
,%g
) może używać separatora dziesiętnego z locale. Dla stałej kropki ustawLC_NUMERIC=C
(np.LC_NUMERIC=C printf '%.2f\n' 3.14
). - GNU/bash rozszerzenia:
%q
i\e
są nie‑POSIX; na systemach bez nich używaj alternatyw (%q
→ narzędzia cytujące,\e
→\033
). - Powłokowe builtiny: W
bash
/zsh
printf
jest builtin – szybciej i bez forka./usr/bin/printf
bywa minimalnie inne (sprawdź--version
). - Brak automatycznego
\n
: Pamiętaj o dodaniu\n
, inaczej prompt „przyklei się” do ostatniego wyjścia. - Bezpieczeństwo danych binarnych:
printf
nadaje się do generowania NUL‑i i bajtów binarnych; wiele narzędzi (np.sed
) nie radzi sobie z\0
– używaj kompatybilnych (xargs -0
,tr
,dd
).
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Komunikat | Przyczyna | Rozwiązanie |
---|---|---|
printf: invalid format / „unknown conversion specifier” | Literówka w specyfikatorze (%S , %ld w GNU itp.) | Użyj wspieranych konwersji POSIX; dla wielkości/liczby całkowitych trzymaj się %d , %u , %x , %o . |
„sklejony” prompt / brak nowej linii | Zapomniany \n w formacie | Dodaj \n lub wypisz printf '\n' na końcu. |
printf: invalid number / niepoprawne %d/%f | Argument nie jest liczbą lub zawiera znaki | Waliduj/konwertuj dane (np. ${var:-0} , printf '%d' "$((var+0))" ). |
Nie działa \e | Implementacja bez rozszerzenia GNU | Użyj \033 lub \x1b jako kodu ESC. |
Zły separator dziesiętny (, zamiast . ) | Locale wpływa na %f | Ustaw LC_NUMERIC=C dla stałej kropki. |
Różnice między builtin a /usr/bin/printf | Minimalne rozjazdy funkcji/komunikatów | W skryptach wskazuj konkretny wariant, jeśli zależy Ci na zachowaniu; testuj command -v printf . |
Linki i źródła
Dział zatytułowany „Linki i źródła”- man printf (GNU coreutils) – oficjalna strona podręcznika.
- GNU Coreutils – printf – dokumentacja online.
- Bash Manual – printf builtin – opis rozszerzeń (np.
-v
,%q
). - POSIX printf(1p) – definicja przenośna.
- BusyBox printf – wariant na systemy wbudowane.