Comando printf in Linux: formattare stringhe, numeri e colonne
Il comando printf stampa testo e numeri secondo una stringa di formato: un modello che specifica dove inserire valori, spazi e interruzioni di riga. Non aggiunge automaticamente una nuova riga: includi \n nel formato quando serve. Negli script usa un formato fisso e passa i dati come argomenti separati.
Distinguere il comando del Bash da quello esterno
Nel Bash, printf è normalmente un comando interno della shell. Può essere installato anche un eseguibile esterno del pacchetto GNU Coreutils. Controlla type printf oppure type -a printf per identificare quello effettivamente risolto dalla shell. Per il comando interno usa help printf: la pagina man printf può invece descrivere l'eseguibile esterno.
Gli esempi sono stati verificati nel Bash 5.3.9 di Git per Windows e, per i formati comuni, anche con il suo eseguibile /usr/bin/printf di GNU Coreutils 8.32. Non tutte le estensioni o opzioni sono intercambiabili. Per esempio, la possibilità del Bash di assegnare il risultato a una variabile con -v non va presunta in qualsiasi printf.
Sintassi, stringhe e interruzioni di riga
printf 'formato' [valore...]
Questa è una notazione, non una riga pronta da eseguire: il primo argomento è il formato, seguito dai valori da inserire. I segnaposto %s e %d richiedono rispettivamente una stringa e un intero. Gli esempi seguenti si eseguono direttamente nel Bash, senza file o dipendenze aggiuntive.
printf 'Hello, %s\n' Linux
L'uscita è Hello, Linux seguita da una nuova riga. Le virgolette singole conservano il formato come un solo argomento; è printf a interpretare \n. Le parole inglesi sono dati letterali della prova, non testo da tradurre nel comando.
Per vedere la differenza, printf '%s' Linux scrive solo i cinque caratteri Linux. Nel terminale il prompt successivo può apparire sulla stessa riga. Aggiungi \n nel formato se vuoi terminare la riga; questa è una scelta esplicita, non un effetto automatico come nell'uso ordinario di echo.
Allineare campi e ripetere il formato
printf '%-12s %5d\n' apple 42
%-12s riserva almeno 12 posizioni alla stringa, allineandola a sinistra; %5d riserva almeno cinque posizioni all'intero, allineandolo a destra. Tra i due campi c'è uno spazio letterale. Con apple e 42 l'uscita contiene apple, undici spazi e 42, poi una nuova riga: sette spazi completano il primo campo, uno separa i campi e tre precedono il numero.
La larghezza è minima, non massima. Prova printf '[%3s] [%03d]\n' pineapple 1234: ottieni [pineapple] [1234], senza troncamento. Per colonne ricavate da dati già delimitati può essere utile il comando column; printf è adatto quando lo script conosce il formato dei valori.
printf '%s\n' one two three
Questo comando produce tre righe: one, two e three. Il formato viene riutilizzato finché restano argomenti da consumare. Se il formato contiene più conversioni, gli argomenti sono consumati in gruppi: printf '%s=%d\n' mele 3 pere 5 produce mele=3 e pere=5 su righe separate.
Non usare il riutilizzo del formato per nascondere dati mancanti. Per esempio, printf '%s=%d\n' mele stampa mele=0: il valore mancante è trattato come zero per quella conversione. Per una stringa mancante si usa una stringa vuota. Controlla il numero di valori quando il dato deve essere obbligatorio.
Confrontare il formato con l'uscita esatta
printf '[%-6s] [%03d]\n' apple 7
Il risultato è:
[apple ] [007]
Le parentesi rendono visibili i confini: dopo apple c'è uno spazio per completare la larghezza 6, mentre il numero 7 diventa 007 grazie allo zero nel formato %03d. Se il numero ha più di tre cifre, viene stampato per intero.
Per stampare un segno di percentuale nel formato scrivi %%. Il comando printf 'Avanzamento: %d%%\n' 42 produce Avanzamento: 42% e una nuova riga. Il primo %d consuma il numero, mentre %% produce il simbolo senza consumare un argomento.
Per un numero con due cifre decimali, LC_ALL=C printf '%.2f\n' 3.14159 produce 3.14 nell'ambiente verificato. Qui il locale C rende esplicito l'uso del punto decimale. Il formato arrotonda la rappresentazione visualizzata; non sostituisce una libreria per calcoli decimali esatti.
Usare un formato fisso e verificare i dati
Non passare una variabile come stringa di formato: i segni % e le sequenze con barra inversa al suo interno potrebbero essere interpretati. Usa invece value='100% pronto\nseconda riga'; printf '%s\n' "$value". L'uscita contiene la sequenza letterale \n del valore e un solo ritorno a capo aggiunto dal formato finale.
Le virgolette doppie intorno a "$value" mantengono il valore come un argomento e impediscono la suddivisione in parole e l'espansione dei caratteri jolly della shell. Puoi verificarlo con value='due parole *'; printf '[%s]\n' "$value", che stampa [due parole *] anche se nella cartella ci sono file. Il formato %s non interpreta le sequenze con barra inversa nei dati; %b invece le interpreta e va scelto solo se questo è l'effetto desiderato.
Per le conversioni numeriche, verifica prima i dati. Bash e GNU printf riconoscono anche costanti con prefissi: printf '%d\n' 010 produce 8, perché lo zero iniziale indica una costante ottale. Il valore 08 non è un numero ottale valido: nella prova il comando segnala un errore e termina con stato diverso da zero, pur potendo aver già scritto un risultato. Non trattare un numero identificativo con zeri iniziali come un intero da convertire senza stabilirne la base.
Le larghezze dei campi ASCII dell'esempio non garantiscono l'allineamento visivo di accenti, emoji, tabulazioni o caratteri larghi in ogni terminale. Controlla il risultato con la codifica, il locale e il carattere tipografico effettivamente usati. Le stringhe del Bash non possono conservare al loro interno un byte NUL: non usarle come contenitori generici di dati binari.
| Formato | Significato |
|---|---|
%s |
Stampa l'argomento come stringa, senza interpretarne le sequenze con barra inversa. |
%d |
Converte l'argomento in intero e lo stampa in decimale. |
%f |
Stampa un numero in notazione decimale; per esempio %.2f richiede due cifre dopo il separatore. |
\n |
Nel formato inserisce un'interruzione di riga. |
%-Ns |
Allinea la stringa a sinistra in un campo di larghezza minima N. |
Domanda frequente
Printf aggiunge automaticamente una nuova riga come echo?
No. Includi la sequenza \n nel formato quando vuoi terminare la riga. Per stampare il contenuto di una variabile, dopo averla definita usa un formato fisso come printf '%s\n' "$value": il valore viene trattato come dato e l'interruzione finale viene dal formato.
Documentazione di riferimento
La sezione printf della pagina di manuale del progetto GNU Bash descrive il comando interno e le sue estensioni. La pagina di manuale di GNU printf riguarda invece l'eseguibile esterno di Coreutils. Entrambe sono pubblicate su man7.org; per la versione installata confronta anche la guida locale.




