Come utilizzare il comando Bash printf su Linux
Pubblicato: 2022-06-25 Il comando Bash printf
ti consente di scrivere su una finestra di terminale Linux con un controllo più fine e più opzioni di formattazione rispetto a quelle fornite dal comando echo
. Anche le stranezze di printf
possono essere utili.
Scrivere su un terminale
È una delle parti più basilari dell'interazione con un programma. Il programma scrive qualcosa sullo schermo e tu lo leggi. Anche prendendo in considerazione la convenzione derivata da Unix e sostenuta da Linux per cui i programmi da riga di comando sono il più concisi possibile, molti scrivono sul terminale solo se qualcosa va storto. Dire all'utente cosa sta succedendo, o sta per accadere, o è appena successo è una primitiva di programmazione essenziale.
La shell Bash ha il comando echo
che può scrivere testo nella finestra del terminale. Può gestire variabili e visualizzarne i valori se sono inclusi nella stringa, e puoi usarlo negli script o sulla riga di comando. Allora perché esiste anche printf
? L' echo
non copre la scrittura del testo? Ebbene, printf
offre funzionalità oltre il semplice atto di scrittura di stringhe su finestre di terminale. Ti consente di formattare l'output con grande flessibilità e ha anche altri trucchi.
Il comando Bash printf
è modellato sulla funzione printf
del linguaggio C, ma ci sono differenze. Se conosci C, dovrai fare attenzione a queste differenze.
Scrivere stringhe di base
Vediamo come differiscono echo
e printf
quando scrivono stringhe sul terminale.
eco ecco alcune parole
printf ecco alcune parole
Il comando echo
stampa tutte le parole ma printf
stampa solo la prima parola. Inoltre, non ci sono nuove righe stampate da printf
. L'output viene confrontato con il prompt dei comandi. Ma, prima di tutto, per fare in modo che printf
agisca su tutte le parole, devono essere citate.
eco ecco alcune parole
printf "ecco alcune parole"
Va meglio. Abbiamo tutte le parole in fase di stampa ma ancora non riceviamo una nuova riga. Questo perché con printf
ottieni una nuova riga solo se ne chiedi una. Potrebbe sembrare una seccatura ma ti consente di decidere se includerne uno o meno. Per fare in modo che printf
emetta una nuova riga, devi includere " \n
" nella tua stringa. Questa è la sequenza di escape "newline".
eco ecco alcune parole
printf "ecco alcune parole\n"
A volte userai una nuova riga e altre volte no. Ecco un caso in cui un'istruzione printf
usa una nuova riga e l'altra no.
printf "Come fare per" && printf "Segnale\n"
Poiché la prima printf
non stampa una nuova riga, l'output della seconda printf
viene posizionato subito dopo “How-To” e sulla stessa riga. Il secondo printf
usa \n
per stampare una nuova riga. Ciò fa apparire il prompt dei comandi sulla riga sotto il testo stampato.
CORRELATO: Come elaborare un file riga per riga in uno script Bash Linux
Altri caratteri di escape
Ecco alcuni altri caratteri di escape che puoi usare. Hai già visto " \n
" in azione.
- \n : Passa a una nuova riga.
- \r : stampa un ritorno a capo. Questo rimanda il cursore di output all'inizio della riga corrente.
- \t : stampa un carattere di tabulazione.
- \v : stampa uno spazio di tabulazione verticale.
- \\ : stampa un carattere barra rovesciata.
- \” : stampa un carattere di virgolette.
- \b : stampa un carattere backspace.
Il carattere di escape del ritorno a capo riporta il cursore all'inizio della riga corrente .
printf "Il miele è la radice di tutti i mali\rIl denaro\n"
Il comando printf
elabora il suo input da sinistra a destra. La stringa viene stampata come testo normale finché printf
non incontra il carattere di escape " \r
". Il cursore di output viene riportato all'inizio della riga corrente.
L'elaborazione della stringa riprende con la lettera immediatamente dietro il carattere “ \r
”. L'elaborazione del resto fa sì che printf
stampi "Denaro", sovrascrivendo la parola "Miele".
Le virgolette “ "
” sono usate per citare le stringhe, e il carattere backslash “ \
” denota sequenze di escape. Se vuoi stampare questi caratteri devi usarne un escape con una barra rovesciata. Questo dice a printf
di trattarli come caratteri letterali.
printf "Questa è una \tTab, questa è una virgoletta \", e questa \\ è una barra rovesciata\n"
Utilizzo di variabili
Usare le variabili con printf
è molto simile a usarle con echo
. Per includere una variabile, come questa variabile di ambiente, anteponila al segno del dollaro " $
" come di consueto.
printf "Cartella principale: $HOME\n"
CORRELATI: Come lavorare con le variabili in Bash
Formatta stringhe
Le stringhe di formato sono stringhe che definiscono il formato dell'output. Fornisci testo e altri valori come argomenti su cui operare la stringa di formato.
La stringa di formato può includere testo, sequenze di escape e identificatori di formato . Gli specificatori di formato dicono a printf
quale tipo di argomento aspettarsi, come stringhe, numeri interi o caratteri.
Questi sono gli identificatori di formato più comuni. Sono tutti preceduti da un segno di percentuale " %
". Per stampare un segno di percentuale, si utilizzano due segni di percentuale insieme " %%
."
- %s : stampa una stringa.
- %c : stampa un singolo carattere.
- %d : stampa un numero intero.
- %f : stampa un numero in virgola mobile.
- %u : stampa un intero senza segno.
- %o : stampa un valore in ottale.
- %x : stampa un valore in esadecimale, in minuscolo.
- %X : stampa un valore in esadecimale, in maiuscolo.
- %e : stampa un numero in virgola mobile in notazione scientifica, in minuscolo.
- %E : stampa un numero in virgola mobile in notazione scientifica, in maiuscolo.
- %% : stampa un simbolo di percentuale "%".
printf "Come fare %s\n" "Secchione"
printf "%s%s %s\n" "Come" "-A" "Secchione"
La stringa di formato nel primo comando include del testo proprio. Passiamo la stringa "Geek" come argomento a printf
. Viene abbinato e stampato dall'identificatore di formato " %s
". Nota che c'è solo uno spazio tra la stringa di formato e la stringa di argomento. In C, avresti bisogno di una virgola per separarli, ma con la versione Bash di printf
è sufficiente utilizzare uno spazio.
La seconda stringa di formato contiene solo identificatori di formato e la sequenza di escape di nuova riga. I tre argomenti di stringa vengono utilizzati a turno da ciascuno degli identificatori di formato " %s
". Ancora una volta, in C, è necessario inserire una virgola tra ogni argomento, ma Bash printf
lo fa dimenticare.
Per stampare diversi tipi di argomenti è sufficiente utilizzare l'identificatore di formato appropriato. Ecco una rapida routine di conversione dei numeri creata usando printf
. Stamperemo il valore 15 in notazione decimale, ottale ed esadecimale.
printf "Dec: %d\nOtt: %o\nHex: %x\n" 15 15 15
Riduciamolo un po' in modo che l'esempio sia meno disordinato.
printf "Esadecimale: %x\n" 15
La maggior parte di noi è abituata a vedere i valori esadecimali in maiuscolo e con valori inferiori a 0x10 stampati con uno zero iniziale. Possiamo ottenere ciò utilizzando l'identificatore di formato esadecimale maiuscolo " %X
" e inserendo un identificatore di larghezza tra il segno di percentuale " %
" e il carattere " X
".
Questo dice a printf
la larghezza del campo in cui deve essere stampato l'argomento. Il campo è riempito di spazi. Con questo formato, i valori a due cifre verrebbero stampati senza alcun riempimento.
printf "Esadecimale: %2X\n" 15
Ora otteniamo un valore maiuscolo, stampato con uno spazio iniziale. Possiamo fare in modo che printf
riempia il campo con zeri invece di spazi mettendo uno zero davanti ai due:
printf "Esadecimale: %02X\n" 15
L'identificatore di precisione consente di impostare il numero di punti decimali da includere nell'output.
printf "Virgola mobile: %08.3f\n" 9.243546
Ciò semplifica la produzione di tabelle dei risultati con output ben allineato. Il prossimo comando mostra anche un'altra delle stranezze di Bash printf
. Se sono presenti più argomenti rispetto agli identificatori di formato, gli argomenti vengono inseriti nella stringa di formato in batch fino a quando tutti gli argomenti non sono stati utilizzati. La dimensione del batch elaborato alla volta corrisponde al numero di identificatori di formato nella stringa di formato. In C, gli argomenti extra nelle chiamate di funzione printf
vengono ignorati.
printf "Mobile: %8.3f\n" 9.243546 23.665 8.0021
È possibile utilizzare gli specificatori di larghezza e precisione anche con le stringhe. Questo comando stampa le stringhe in un campo largo 10 caratteri.
printf "%10s %d\n" "cappotti" 7 "scarpe" 22 "Ombrelli" 3
Per impostazione predefinita, i valori sono giustificati a destra nei rispettivi campi. Per giustificarli a sinistra, utilizzare un segno meno “ -
” immediatamente dietro il segno di percentuale “ %
”.
printf "%-10s %d" "cappotti" 7 "scarpe" 22 "Ombrelli" 3
L'identificatore di precisione può essere utilizzato per impostare il numero massimo di caratteri da stampare. Stiamo usando i due punti “ :
” per mostrare i limiti del campo di larghezza. Non come viene troncata la parola "Ombrelli".
printf ":%10.6s:\n" "cappotti" "scarpe" "Ombrelli"
printf ":%-10.6s:\n" "cappotti" "scarpe" "Ombrelli"
L'identificatore di larghezza può anche essere passato come argomento . Utilizzare un asterisco " *
" invece di un identificatore numerico e passare la larghezza come argomento intero.
printf "%*s\n" 20 "Più a destra" 12 "Medio" 5 "Più a sinistra"
Altri trucchi e stranezze
Gli identificatori di formato all'interno della stringa di formato funzioneranno con valori del tipo appropriato, indipendentemente dal fatto che siano forniti sulla riga di comando come argomenti regolari o siano generati come output di un'espressione .
Questo stampa la somma di due numeri:
printf "23+32=%d\n" $((23+32))
Questo comando stampa il numero di directory nella directory di lavoro corrente:
printf "Ci sono %d directory\n" $(ls -d */ | wc -l)
Questo comando printf
stampa una stringa restituita da una chiamata a un altro comando.
printf "Utente corrente: %s\n" $(whoami)
Se un identificatore di formato stringa “ %s
” non viene fornito con un argomento printf
non stampa nulla.
printf "Uno: %s due: %s\n" "Alfa"
Se un identificatore di formato stringa “ %s
” viene fornito per errore con un valore numerico, lo stampa come se fosse una stringa e non si lamenta. Non provare con C printf
: accadranno cose molto brutte. Il tuo programma probabilmente andrà in crash. Ma Bash printf
lo gestisce senza lamentarsi.
printf "Uno: %s due: %s\n" "Alfa" 777
Se un identificatore di formato intero “ %d
” non riceve alcun argomento, stamperà zero.
printf "Intero: %d\n"
Se un identificatore di formato intero " %d
" riceve un argomento stringa per errore, Bash stamperà un messaggio di errore e printf
stamperà zero.
printf "Intero: %d\n" "Sette"
I simboli scomodi possono essere generati utilizzando il loro numero Unicode o "punto di codice". Questi vengono sottoposti a escape utilizzando la lettera "u" seguita dal loro valore Unicode.
printf "Il simbolo dell'Euro: \u20AC\n"
Per includere sequenze di escape nelle stringhe di argomenti , è necessario utilizzare l'identificatore di formato “ %b
” nella stringa di formato, non l'identificatore di formato della stringa “ %s
”.
printf "%s" "\u20AC\n"
printf "%b" "\u20AC\n"
La prima istruzione printf
non elabora il valore Unicode e non riconosce la sequenza di escape di nuova riga. La seconda istruzione printf
utilizza l'identificatore di formato " %b
". Ciò gestisce correttamente il carattere Unicode e viene stampata una nuova riga.
CORRELATI: Cosa sono le codifiche dei caratteri come ANSI e Unicode e in che cosa differiscono?
Cavalli per Corsi
A volte tutto ciò che devi fare è fare echo
del testo alla finestra del terminale. Ma quando devi applicare un po' di posizionamento e formattazione, printf
è lo strumento giusto per il lavoro.
printf "%b" "Tha-" "tha-" "tha-" "questo è tutto gente.\n"