Il modo più semplice per stampare nella riga di comando di Linux è usare il comando echo.
echo "Value of var is $var"
Tuttavia, il comando echo non sarà adeguato quando è necessario stampare un output formattato.
È qui che il comando printf ti aiuta. Il comando bash printf funziona come il comando printf nel linguaggio di programmazione C/C++.
printf "My brother %s is %d years old.\n" Prakash 21
Riesci a indovinare l'output?

Il primo argomento %s
si aspetta una stringa, %d
si aspetta un numero intero decimale, proprio come C/C++. Non preoccuparti se non hai familiarità con C/C++.
Non è necessario impararlo solo per usare il comando printf nei tuoi script Bash. Lascia che ti mostri alcuni esempi del comando Bash printf.
Utilizzo del comando Bash printf
Cominciamo prima con la sintassi.
printf format [arguments]
Qui, format
è una stringa che determina come verranno visualizzati i valori successivi.
Nell'esempio printf "My brother %s is %d years old.\n" Prakash 21
, l'intero "Mio fratello %s ha %d anni.\n" è formato ed è seguito dagli argomenti Prakash
e 21
. Gli argomenti vengono utilizzati per sostituire gli identificatori di formato (%s, %d ecc.) che spiegherò più avanti in questo articolo.
Nella sua forma più semplice, printf può essere usato come comando echo per visualizzare una stringa.
printf "Hello World\n"
Nota il nuovo carattere di riga \n
alla fine? La differenza tra il comando echo e printf è che echo aggiunge automaticamente un nuovo carattere di riga alla fine, ma per printf, devi aggiungerlo esplicitamente.

Prestare particolare attenzione al tipo e al numero di argomenti
Tieni presente che la stringa di formato tenta di essere applicata a tutti gli argomenti. Questo è il motivo per cui dovresti prestare particolare attenzione ad esso.
[email protected]:~$ printf "Hello, %s! \n" Abhishek Prakash
Hello, Abhishek!
Hello, Prakash!

Allo stesso modo, dovresti anche prestare attenzione al tipo di identificatore di formato previsto nella stringa di formato.

Come puoi vedere nell'esempio sopra, se non trova gli argomenti desiderati, mostra i valori predefiniti che sono null per le stringhe e 0 per i numeri interi.
printf "Hi %s, your room number is %d. \n" Abhishek Prakash 131
bash: printf: Prakash: invalid number
Hi Abhishek, your room number is 0.
Hi 131, your room number is 0.
Qui ci vuole Abhishek Prakash
come primo insieme di argomenti e 131
come seconda serie di argomenti.
Quando trova una stringa (Prakash) invece di un numero intero, si lamenta ma continua a visualizzare l'output con il secondo argomento al suo valore predefinito 0.
Allo stesso modo, vede 131 come stringa nel secondo set di argomenti e poiché il secondo argomento è assente, il valore predefinito è 0.
Caratteri di specifica del formato
Sono disponibili diversi identificatori di formato per visualizzare l'output nel formato desiderato. Ecco alcuni dei più comuni:
Personaggio | Utilizzo |
---|---|
%s | Stringa |
%c | Singolo carattere |
%d | Interi |
%o | Interi ottali |
%x | Interi esadecimali |
%f | Virgola mobile |
%b | Stringa con carattere di escape barra rovesciata |
%% | Segno percentuale |
Ora che hai familiarità con l'identificatore di formato, vediamo altri esempi che li mostrano in azione.
Esempi di comando Bash printf
Non credo che tu abbia bisogno di una spiegazione dettagliata per la maggior parte di questi esempi in quanto sono autoesplicativi.
[email protected]:~$ printf "The octal value of %d is %o\n" 30 30
The octal value of 30 is 36
Vediamo l'uso del %b
specificatore per interpretare correttamente il carattere di escape della barra rovesciata.
[email protected]:~$ printf "String with backslash: %s\n" "Hello\nWorld!"
String with backslash: Hello\nWorld!
Vedi per %s
, non fa differenza. Ma con %b
il nuovo carattere di escape di riga verrà interpretato correttamente:
[email protected]:~$ printf "String with backslash: %b\n" "Hello\nWorld!"
String with backslash: Hello
World!
Quando usi il %c
, legge solo caratteri alla volta.
[email protected]:~$ printf "Character: %c\n" a
Character: a
[email protected]:~$ printf "Character: %c\n" a b c
Character: a
Character: b
Character: c
[email protected]:~$ printf "Character: %c\n" abc
Character: a
Utilizzo dei modificatori per visualizzare l'output di printf in uno stile specifico
Ci sono modificatori per cambiare l'aspetto dell'output a tuo piacimento.
# modificatore per numeri ottali ed esadecimali
In precedenza hai visto l'uso di %o
per convertire decimale in ottale. Tuttavia, non era molto chiaro che fosse un numero ottale. Puoi usare il #
modificatore per visualizzare i numeri ottali ed esadecimali nel formato corretto.
[email protected]:~$ printf "%d is %#o in octal and %#x in hexadecimal\n" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal
Modificatore di spazio per interi positivi
Puoi utilizzare uno spazio tra %
e d
in %d
per visualizzare un numero intero positivo con uno spazio iniziale. Questo aiuta quando hai una colonna di numeri positivi e negativi. Guarda quale sembra più "carino":
[email protected]:~$ printf "%d \n%d \n%d \n" 10 -10 10
10
-10
10
[email protected]:~$ printf "% d \n%d \n% d \n" 10 -10 10
10
-10
10
Modificatore di larghezza
Il modificatore di larghezza è un numero intero che specifica la larghezza minima del campo dell'argomento.
Per impostazione predefinita, è allineato a destra:
[email protected]:~$ printf "%10s| %5d\n" Age 23
Age| 23
Puoi allinearlo a sinistra aggiungendo -
segnalalo:
[email protected]:~$ printf "%-10s| %-5d\n" Age 23
Age | 23
Modificatore di precisione
È possibile utilizzare il punto modificatore di precisione (.) per specificare un numero minimo di cifre da visualizzare con %d
, %u
, %o
, %x
. Aggiunge zero padding a sinistra del valore.
[email protected]:~$ printf "Roll Number: %.5d\n" 23
Roll Number: 00023
Se usi il modificatore di precisione con una stringa, specifica la lunghezza massima della stringa. Se la stringa è più lunga, viene troncata sul display.
[email protected]:~$ printf "Name: %.4s\n" Abhishek
Name: Abhi
Puoi combinare sia la larghezza che il modificatore di precisione:
[email protected]:~$ printf "Name: %.4s\n" Abhishek
Name: Abhi
[email protected]:~$ printf "Name: %10.4s\n" Abhishek
Name: Abhi
Esempio bonus:mostra l'output in formato tabulare con printf
Mettiamo a frutto ciò che hai imparato sul comando printf con un esempio leggermente più complicato. Questo mostrerà il vero potenziale del comando printf negli script bash.
Usiamo il comando printf per stampare la seguente tabella usando bash:
Nome | ID | Età | Voti |
---|---|---|---|
Sherlock Holmes | 0000122 | 23 | A |
James Bond | 0000007 | 27 | F |
Ercole Poirot | 0006811 | 59 | G |
Jane Marple | 1234567 | 71 | C |
Ecco lo script di shell che ho scritto per questa attività. Il tuo script può variare:
#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %c\n"
TableWidth=37
printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades
printf "%.${TableWidth}s\n" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C
Ora, se eseguo questo script di shell bash, ecco cosa stampa:

Non è meraviglioso usare il comando bash printf per stampare un output splendidamente formattato per i tuoi script?
Spero che questo tutorial dettagliato sul comando printf in Linux ti sia piaciuto. Se avete domande o suggerimenti, fatemelo sapere. E non dimenticare di diventare un membro di Linux Handbook per ulteriori informazioni sull'apprendimento di Linux.