Casa Studia Come utilizzare il comando Bash printf su Linux

Come utilizzare il comando Bash printf su Linux

di Frank
Pubblicato: Ultimo aggiornamento il

introduzione

Il comando Bash printf offre maggiore flessibilità e scelte di formattazione rispetto al comando echo quando si scrive su una finestra di terminale Linux. Anche le peculiarità di printf possono essere utili.

È uno degli aspetti più fondamentali del lavoro con il software. Leggi ciò che l'applicazione ha scritto sullo schermo. Anche con l'abitudine derivata da Unix e supportata da Linux di programmi da riga di comando il più brevi possibile, molte applicazioni scrivono sul terminale solo quando qualcosa va storto. Una base di programmazione fondamentale è informare l'utente di ciò che sta accadendo, sta per accadere o è accaduto di recente.

Il comando echo nella shell Bash può scrivere del testo sul display del terminale. Puoi usarlo negli script o sulla riga di comando e può gestire variabili e mostrare i loro valori se sono contenuti nella stringa. Allora, qual è il punto di printf? La scrittura del testo non è qualcosa di cui si occupa l'eco? Printf, d'altra parte, fornisce più della semplice possibilità di scrivere stringhe su finestre di terminale. Ti dà molta versatilità quando si tratta di formattare l'output e ha alcuni assi aggiuntivi nella manica.

Il comando printf in Bash è simile alla funzione printf in C, tuttavia ci sono diverse modifiche. Dovrai essere a conoscenza delle modifiche se hai familiarità con C.

Creazione di stringhe semplici

Diamo un'occhiata alle differenze tra echo e printf quando si tratta di scrivere stringhe sul terminale.

eco ecco alcune parole
printf ecco alcune parole

Utilizzo di echo e printf con parole senza virgolette

Mentre echo stampa tutte le parole, printf pubblica semplicemente la prima. Inoltre, printf non stampa una nuova riga. L'output è proprio dab nel mezzo del prompt dei comandi. Ma prima di tutto, tutte le parole devono essere citate affinché printf agisca su di esse.

eco ecco alcune parole
printf "ecco alcune parole"

Usando echo e printf con le parole citate

Questo è un passo avanti. Abbiamo stampato tutte le parole, ma stiamo ancora aspettando una nuova riga. Questo perché printf stampa una nuova riga solo se ne richiedi specificamente una. Questo può sembrare scomodo, ma ti consente di scegliere se aggiungerne uno o meno. Devi aggiungere "n" nella tua stringa affinché printf emetta una nuova riga. Qui viene utilizzata la sequenza di escape "newline".

eco ecco alcune parole
printf "ecco alcune parolen"

Usando echo e printf con le parole citate e il carattere di nuova riga

Utilizzerai una nuova riga a volte e non altre. In questo esempio, un comando printf utilizza una nuova riga mentre l'altro no.

printf "Come fare per" && printf "Geekn"

Utilizzo di due printfs per creare una singola riga di testo

Poiché la prima printf non stampa una nuova riga, l'output della seconda printf viene posizionato sulla stessa riga di "Come fare per". Per stampare una nuova riga, la seconda printf utilizza n. Il prompt dei comandi verrà ora visualizzato sulla riga sotto il testo stampato.

Personaggi che sono sfuggiti alla cattura

Ecco alcuni caratteri aggiuntivi che possono essere usati come escape. In precedenza hai visto come funziona "n".

n: passa a una nuova riga.
r: questo comando stampa un ritorno a capo. Il cursore di output viene riportato all'inizio della riga corrente.
t: questo comando stampa un carattere di tabulazione.
v: aggiunge uno spazio di tabulazione verticale alla pagina.
\: Viene stampato un carattere barra rovesciata.
“: Visualizza tra virgolette.
b: Visualizza il carattere backspace.

Il carattere di escape del ritorno a capo viene utilizzato per riportare il cursore all'inizio della riga corrente.

printf "Il miele è la radice di tutti i maliMoneyn"

Utilizzando il carattere di ritorno a capo per tornare all'inizio della riga

Il comando printf legge da sinistra a destra. Fino a quando printf non rileva il carattere di escape "r", la stringa viene scritta come un normale testo. Il cursore di output viene riposizionato all'inizio della riga corrente.

Con la lettera immediatamente sotto il carattere “r”, l'elaborazione della stringa continua. Il resto fa sì che printf stampi "Money", che sostituisce la frase "Honey".

Il carattere backslash “” segnala le sequenze di escape, mentre le virgolette “”” vengono utilizzate per citare le stringhe. Se desideri stampare questi caratteri, usa una barra rovesciata per evitarli. Questo indica a printf che dovrebbero essere trattati come caratteri letterali.

printf "Questa è una tTab, questa è una virgoletta ", e questa \ è una barra rovesciata"

Caratteri di escape in modo che vengano trattati alla lettera

Variabili in azione

L'uso di variabili con printf è abbastanza simile all'uso di variabili con echo. Per includere una variabile, come questa variabile di ambiente, utilizzare il simbolo del dollaro "$" come di consueto prima di essa.

printf "Cartella principale: $HOMEn"

Utilizzo di printf con una variabile di ambiente

Formattazione delle stringhe

Le stringhe di formato sono stringhe che specificano il formato di output. Fornisci il testo della stringa di formato e valori aggiuntivi con cui lavorare come argomenti.

Testo, sequenze di escape e identificatori di formato possono essere tutti inclusi nella stringa di formato.

Gli specificatori di formato di Printf lo informano sul tipo di argomento che dovrebbe accettare, come stringhe, numeri o caratteri.

Di seguito sono riportati gli identificatori di formato più frequenti. Un simbolo di percentuale "percentuale" li precede tutti. È possibile stampare un segno di percentuale combinando due segni di percentuale "percentuale percentuale".

  • %s: stampa una stringa.
  • %c: stampa un singolo carattere.
  • %d: stampa un numero intero.
  • %f: stampa un numero in virgola mobile.
  • %u: stampa un numero intero senza segno.
  • 1TP2A: stampa un valore in ottale.
  • %x: Prints a value 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.
  • %%: Prints a percent “%” symbol.
printf "Come fare %sn" "Geek"
printf "%s%s %sn" "Come" "-A" "Geek"

Mostra printf che accetta "troppi" argomenti

La stringa di formato del primo comando contiene del proprio contenuto. La stringa "Geek" viene inviata a printf come argomento. L'identificatore di formato "%s" lo abbina e lo stampa. Tra la stringa di formato e la stringa di argomento c'è solo uno spazio. In C, sarebbe necessaria una virgola per separarli, ma con la versione Bash di printf, uno spazio è sufficiente.

Solo gli identificatori di formato e la sequenza di escape di nuova riga sono inclusi nella seconda stringa di formato. Ciascuno degli identificatori di formato "%s" utilizza a turno i tre parametri di stringa. Ancora una volta, in C, è richiesta una virgola tra ogni parametro, ma la funzione Bash printf ci consente di ignorare questo requisito.

Usa semplicemente l'identificatore di formato appropriato per generare vari tipi di argomenti. Ecco una semplice funzione di conversione dei numeri basata su printf. In notazione decimale, ottale ed esadecimale, stamperemo il numero 15.

printf "Dec: %dnOct: %onHex: %xn" 15 15 15

usando printf per stampare valori numerici in diverse notazioni di base

Riduciamolo un po' per rendere l'esempio meno disordinato.

printf "Esadecimale: %xn" 15

Stampa di un valore esadecimale

La maggior parte di noi è abituata a vedere i numeri esadecimali resi in maiuscolo e con valori inferiori a 0x10 preceduti da uno zero iniziale. Possiamo farlo inserendo un identificatore di larghezza tra il segno di percentuale "%" e il carattere "X" e utilizzando l'identificatore di formato esadecimale maiuscolo "% X".

Questo specifica la dimensione del campo in cui l'argomento deve essere stampato su printf. Gli spazi sono stati aggiunti al campo. I numeri a due cifre verrebbero presentati senza alcun riempimento in questo stile.

printf "Esadecimale: %2Xn" 15

stampa di un valore esadecimale in maiuscolo in un campo di 2 caratteri di larghezza

Ora abbiamo un valore maiuscolo con uno spazio iniziale scritto su di esso. Mettendo uno zero davanti ai due, possiamo fare in modo che printf riempia il campo con zeri anziché spazi:

printf "Hex: %02Xn" 15

stampa di un valore esadecimale in maiuscolo in un campo con larghezza di 2 caratteri riempito con zeri

L'identificatore di precisione consente di specificare quanti punti decimali devono essere inclusi nell'output.

printf "Floating point: %08.3fn" 9.243546

Utilizzo dei modificatori di larghezza e precisione con un numero in virgola mobile

Questo rende la creazione di tabelle di risultati con output perfettamente allineato un gioco da ragazzi. Questo comando mostra anche un'altra delle idiosincrasie di Bash printf. Se sono presenti più argomenti rispetto agli specificatori di formato, gli argomenti vengono inseriti nella stringa di formato in batch finché non vengono utilizzati tutti. La quantità di identificatori di formato nella stringa di formato determina la dimensione del batch che viene elaborato in un determinato momento. Gli argomenti aggiuntivi inviati alla funzione printf in C vengono ignorati.

printf "Mobile: %8.3fn" 9.243546 23.665 8.0021

Utilizzo dei modificatori di larghezza e precisione per creare una tabella ordinata

Le stringhe possono anche utilizzare gli specificatori di larghezza e precisione. Le stringhe vengono stampate in un campo largo 10 caratteri utilizzando questo comando.

printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3

Usando il modificatore di larghezza con le stringhe

By default, values are right-justified in their fields. To left-justify them, use a minus sign “-” immediately behind the percent “%” sign.

printf "%-10s %d" "cappotti" 7 "scarpe" 22 "Ombrelli" 3

Utilizzo di uno specificatore di larghezza giustificato a sinistra con stringhe

L'identificatore di precisione consente di scegliere il numero massimo di caratteri che verranno stampati. Le lettere dei due punti “:” sono usate per indicare i limiti del campo di larghezza. Non nel modo in cui il termine “ombrelli” è abbreviato.

printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "cappotti" "scarpe" "Ombrelli"

Utilizzo del modificatore di precisione per limitare il numero di caratteri stampati da una stringa

Anche come argomento, è possibile utilizzare l'identificatore di larghezza. Invece di uno specificatore numerico, utilizzare un asterisco "*" e fornire la larghezza come input intero.

printf "%*sn" 20 "Più a destra" 12 "Medio" 5 "Più a sinistra"

Passando l'identificatore di larghezza come argomento a printf

Altre stranezze ed espedienti

Gli identificatori di formato nella stringa di formato funzioneranno con valori del tipo corretto, indipendentemente dal fatto che vengano forniti come argomenti ordinari sulla riga di comando o creati come risultato di un'espressione.

Questo mostra il risultato della somma di due numeri:

printf "23+32=%dn" $((23+32))

Stampa della somma di due numeri

Il numero di cartelle nella directory di lavoro corrente viene stampato da questo comando:

printf "Ci sono directory %d" $(ls -d */ | wc -l)

Conteggio directory con printf

Il comando printf stampa una stringa che è stata restituita da un altro programma.

printf "Utente corrente: %sn" $(whoami)

Stampa dell'output da un altro comando

Se l'identificatore di formato della stringa "percent s" non viene fornito con un argomento, printf restituisce null.

printf "Uno: %s due: %sn" "Alfa"

Come printf gestisce gli argomenti di stringa mancanti

Se per errore viene fornito un valore numerico per l'identificatore di formato stringa "% s", lo stampa come stringa e non si lamenta. Se lo fai usando C printf, ti ritroverai con molti problemi. Il tuo software quasi sicuramente andrà in crash. Il Bash printf, d'altra parte, non sembra preoccupare.

printf "Uno: %s due: %sn" "Alfa" 777

Come printf accetta silenziosamente interi come valori di stringa

Se all'identificatore di formato intero "% d" non viene fornito un argomento, viene stampato zero.

printf "Intero: %dn"

Come printf gestisce gli argomenti interi mancanti

Bash emetterà un messaggio di errore e printf stamperà zero se l'identificatore di formato intero "% d" riceve un input di stringa per errore.

printf "Intero: %dn" "Sette"

Come printf tratta le stringhe fornite invece degli argomenti interi

I simboli scomodi possono essere creati inserendo il loro numero Unicode, noto anche come "punto di codice". La lettera "u" viene utilizzata per sfuggire a determinati caratteri, seguita dal loro valore Unicode.

printf "Il simbolo dell'Euro: u20ACn"

Stampa di un valore Unicode con escape

Per adattare le sequenze di escape nelle stringhe di argomenti, utilizzare l'identificatore di formato "% b" invece dell'identificatore di formato stringa "% s" nella stringa di formato.

printf "%s" "u20ACn"
printf "%b" "u20ACn"

Utilizzo dell'identificatore di formato %b per gestire le sequenze di escape negli argomenti di stringa

Il comando printf iniziale non riconosce la sequenza di escape di nuova riga e non elabora il valore Unicode. L'identificatore di formato "% b" viene utilizzato nel secondo comando printf. Il carattere Unicode viene gestito in modo appropriato e viene visualizzata una nuova riga.

Cavalli per Corsi

A volte potresti aver solo bisogno di fare eco del testo nella finestra del terminale. Tuttavia, printf è lo strumento ideale per l'attività quando è necessario applicare alcuni posizionamenti e formattazioni.

printf "%b" "Tha-" "tha-" "tha-" "questo è tutto gente.n"

Potrebbe piacerti anche

Navhow è dedicato a insegnare alle persone di tutto il mondo come fare qualsiasi cosa.

 

sottoscrivi

La migliore newsletter di istruzioni ovunque

©2022 Navhow, Tutti i diritti riservati