
In genere, quando scriviamo script bash, utilizziamo echo
per stampare sullo standard output. echo
è un comando semplice ma le sue capacità sono limitate.
Per avere un maggiore controllo sulla formattazione dell'output, usa il printf
comando.
Il printf
il comando formatta e stampa i suoi argomenti, in modo simile al C printf()
funzione.
printf
Comando #
printf
è una shell integrata in Bash e in altre shell popolari come Zsh e Ksh. C'è anche un /usr/bin/printf
autonomo binario, ma la versione incorporata della shell ha la precedenza. Tratteremo la versione incorporata di Bash di printf
.
La sintassi per printf
il comando è il seguente:
printf [-v var] format [arguments]
Il -v
l'opzione dice a printf
non per stampare l'output ma per assegnarlo alla variabile.
Il format
è una stringa che può contenere tre diversi tipi di oggetti:
- Caratteri normali che vengono semplicemente stampati sull'output così com'è.
- Caratteri con escape barra rovesciata che vengono interpretati e quindi stampati.
- Specifiche di conversione che descrivono il formato e sono sostituite dai valori dei rispettivi argomenti che seguono la stringa di formato.
Il comando accetta un numero qualsiasi di arguments
. Se più arguments
rispetto agli specificatori di formato, il format
string viene riutilizzato per consumare tutti gli argomenti. Se meno arguments
rispetto agli identificatori di formato forniti, gli identificatori di formato numerico extra sono impostati su zero mentre gli identificatori di formato stringa sono impostati su stringa nulla.
Di seguito sono riportati alcuni punti da considerare quando si passano argomenti al printf
comando:
- La shell sostituirà tutte le variabili, i caratteri jolly e i caratteri speciali prima di passare gli argomenti a
printf
comando. - Quando si utilizzano virgolette singole
''
il valore letterale di ogni carattere racchiuso tra le virgolette verrà mantenuto. Variabili e comandi non verranno espansi.
printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34
Closed issues: 65
La stringa Open issues: %s\nClosed issues: %s\n
è il format
mentre “34” e “65” sono argomenti. La stringa di formato contiene due caratteri di nuova riga (\n
) e due identificatori di formato (%s
) che vengono sostituiti con gli argomenti.
Il printf
il comando non aggiunge un carattere di nuova riga (\n
) alla fine della riga.
Caratteri con backslash-escaped #
I caratteri con escape barra rovesciata vengono interpretati quando vengono utilizzati nella stringa di formato o in un argomento corrispondente a un %b
identificatore di conversione. Ecco un elenco dei caratteri di escape più comuni:
\\
- Visualizza un carattere barra rovesciata.\b
- Visualizza un carattere backspace.\n
- Visualizza una nuova riga.\r
- Visualizza un ritorno a capo.\t
- Visualizza una scheda orizzontale.\v
- Visualizza una scheda verticale.
Specifiche di conversione #
Una specifica di conversione assume la forma seguente:
%[flags][width][.precision]specifier
Ciascuna specifica di conversione è contrassegnata dal segno di percentuale (%
), include modificatori facoltativi e termina con una delle seguenti lettere che rappresentano il tipo di dati (specifier
) dell'argomento corrispondente:aAbcdeEfgGioqsuxX
.
Digita l'identificatore di conversione #
La conversione del tipo specifier
è un carattere che specifica come interpretare l'argomento corrispondente. Questo carattere è obbligatorio e viene posizionato dopo i campi facoltativi.
Di seguito è riportato un elenco che mostra tutte le conversioni di tipo e ciò che fanno:
%b
- Stampa l'argomento mentre espandi le sequenze di escape della barra rovesciata.%q
- Stampa l'argomento shell-quoted, riutilizzabile come input.%d
,%i
- Stampa l'argomento come un intero decimale con segno.%u
- Stampa l'argomento come un intero decimale senza segno.%o
- Stampa l'argomento come un intero ottale senza segno.%x
,%X
- Stampa l'argomento come intero esadecimale senza segno.%x
stampa lettere minuscole e%X
stampa in maiuscolo.%e
,%E
- Stampa l'argomento come numero a virgola mobile in notazione esponenziale.%e
stampa lettere minuscole e%E
stampa in maiuscolo.%a
,%A
- Stampa l'argomento come numero a virgola mobile in notazione frazionaria esadecimale.%a
stampa lettere minuscole e%A
stampa in maiuscolo.%g
,%G
- Stampa l'argomento come numero a virgola mobile in notazione normale o esponenziale, a seconda di quale sia più appropriato per il valore e la precisione dati.%g
stampa lettere minuscole e%G
stampa in maiuscolo.%c
- Stampa l'argomento come un singolo carattere.%f
- Stampa l'argomento come numero a virgola mobile.%s
- Stampa l'argomento come una stringa.%%
- Stampa un letterale%
simbolo.
Un numero senza segno rappresenta zero e numeri positivi, mentre un numero con segno rappresenta numeri negativi, zero e positivi.
Il comando seguente stampa il numero 100 in tre diversi sistemi di numerazione:
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100
Hex: 64
Octal: 144
Direttiva Flag #
I flag sono i primi modificatori opzionali e vengono utilizzati per impostare la giustificazione, gli zeri iniziali, i prefissi, ecc.
Ecco i più comuni:
-
- Allineare a sinistra il testo stampato all'interno del campo. Per impostazione predefinita, il testo è allineato a destra.+
- Prefissa i numeri con un+
o-
segni. Per impostazione predefinita, solo i numeri negativi sono preceduti da un segno negativo.0
- Riempi i numeri con zeri iniziali anziché spazi.- vuoto
- Prefissare i numeri positivi con uno spazio vuoto e i numeri negativi con un meno (
-
). #
- Un formato alternativo per i numeri.
Direttiva larghezza #
La width
la direttiva archiviata viene posizionata dopo qualsiasi carattere flag e specifica il numero minimo di caratteri in cui dovrebbe risultare la conversione.
Se la larghezza del testo emesso è inferiore alla larghezza specificata, viene riempita con spazi. La larghezza può essere specificata come un intero decimale non negativo o un asterisco (*
).
Ecco un esempio:
printf "%20s %d\n" Mark 305
%20s
significa impostare il campo lungo almeno 20 caratteri. Gli spazi vuoti vengono aggiunti prima del testo perché, per impostazione predefinita, l'output è giustificato a destra. Per allineare il testo a sinistra, usa -
flag (%-20s
).
Mark 305
Quando un asterisco (*
) viene utilizzato come width
direttiva, quindi la larghezza del campo di conversione viene impostata da un argomento larghezza che precede l'argomento che viene formattato.
Nell'esempio seguente impostiamo la larghezza su 10:
printf "%0*d" 10 5
0
è una bandiera che riempie il numero con zeri iniziali invece di spazi vuoti. Il testo di output avrà almeno 10 caratteri:
0000000005
Direttiva sulla precisione #
Il .precision
modificatore è costituito da un punto (.
) seguito da un numero intero positivo o da un asterisco (*
) che, a seconda del tipo di specificatore, imposta il numero di caratteri stringa o cifre o il numero di cifre decimali da stampare.
La precisione ha il seguente effetto:
- Se il tipo di conversione è un intero, la precisione specifica il numero minimo di cifre da stampare. Se il numero di cifre nell'argomento è inferiore alla precisione, vengono stampati degli zeri iniziali.
- Se il tipo di conversione è a virgola mobile, la precisione specifica il numero di cifre che seguono il carattere a virgola decimale. La precisione predefinita è 6.
- Se il tipo di conversione è una stringa, la precisione specifica il numero massimo di caratteri da stampare. Se il numero di caratteri nell'argomento è maggiore della precisione, i caratteri in eccesso vengono troncati.
Ecco un esempio che mostra come arrotondare un numero a virgola mobile a 3 decimali:
printf "%.3f" 1.61803398
1.618
Quando la precisione è impostata su un asterisco (*
), il suo valore è impostato dall'argomento precision che precede l'argomento che viene formattato.
printf "%.*f" 3 1.61803398
1.618
Conclusione #
Il printf
il comando prende un formato e argomenti e stampa un testo formattato.
Se hai domande o feedback, sentiti libero di lasciare un commento.