Przejdź do głównej zawartości

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 w bash, zsh, ksh (drobne różnice funkcji/rozszerzeń). Na systemach BSD/macOS również dostępne (z różnicami implementacyjnymi).

Okno terminala
# GNU coreutils
printf [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.

ParametrOpis
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).
EscapyW 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.

Okno terminala
# 1) Łańcuch bez automatycznego nowego wiersza
printf 'Witaj świecie!\n'
# Efekt: dokładnie jeden wiersz z \n na końcu.
Okno terminala
# 2) Formatowanie liczb całkowitych i zerowe wypełnienie
printf 'ID=%08d\n' 42
# Efekt: ID=00000042
Okno terminala
# 3) Liczby zmiennoprzecinkowe z precyzją i szerokością
printf '%8.3f\n' 3.14159 2.5
# Efekt: 3.142\n 2.500
Okno terminala
# 4) Kolorowanie komunikatu (ESC = \033); reset atrybutów na końcu
printf '\033[1;32mOK\033[0m\n'
# Efekt: zielony pogrubiony napis „OK”.
Okno terminala
# 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.
Okno terminala
# 6) Generowanie bajtów binarnych (pliki/test API)
printf '\xDE\xAD\xBE\xEF' > frame.bin
# Efekt: plik 4‑bajtowy 0xDEADBEEF.
Okno terminala
# 7) Bash: zapis wyniku do zmiennej i cytowanie dla powłoki
printf -v quoted '%q' "$PWD"; echo "$quoted"
# Efekt: ścieżka zapisana tak, by była bezpieczna jako argument shella.
Okno terminala
# 8) Dynamiczna szerokość i precyzja z argumentów
printf '%*.*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 preferuj printf.
  • Locale a liczby: Formatowanie liczb (%f, %g) może używać separatora dziesiętnego z locale. Dla stałej kropki ustaw LC_NUMERIC=C (np. LC_NUMERIC=C printf '%.2f\n' 3.14).
  • GNU/bash rozszerzenia: %q i \enie‑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).

Błąd / KomunikatPrzyczynaRozwią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 liniiZapomniany \n w formacieDodaj \n lub wypisz printf '\n' na końcu.
printf: invalid number / niepoprawne %d/%fArgument nie jest liczbą lub zawiera znakiWaliduj/konwertuj dane (np. ${var:-0}, printf '%d' "$((var+0))").
Nie działa \eImplementacja bez rozszerzenia GNUUżyj \033 lub \x1b jako kodu ESC.
Zły separator dziesiętny (, zamiast .)Locale wpływa na %fUstaw LC_NUMERIC=C dla stałej kropki.
Różnice między builtin a /usr/bin/printfMinimalne rozjazdy funkcji/komunikatówW skryptach wskazuj konkretny wariant, jeśli zależy Ci na zachowaniu; testuj command -v printf.