Come utilizzare il comando Bash printf su Linux

Un terminale Linux su sfondo blu.
fatmawati achmad zaenuri/Shutterstock.com

Il Bash printf Il comando ti consente di scrivere su una finestra di terminale Linux con un controllo più fine e più opzioni di formattazione rispetto a echo il comando fornisce. Persino printf Le stranezze di ‘s 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 bene sbagliato. Dire all’utente cosa sta succedendo, o sta per accadere, o è appena successo è una primitiva di programmazione essenziale.

Come utilizzare il comando Echo su Linux

IMPARENTATOCome utilizzare il comando Echo su Linux

La shell Bash ha il echo comando 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é lo fa printf esistono anche? Non lo fa echo hanno coperto la cosa della scrittura del testo? Bene, printf offre funzionalità oltre il semplice atto di scrivere stringhe su finestre di terminale. Ti consente di formattare l’output con grande flessibilità e ha anche altri trucchi.

Il Bash printf il comando è modellato su printf funzione dal linguaggio C, ma ci sono differenze. Se conosci C, dovrai fare attenzione a queste differenze.

Scrivere stringhe di base

Vediamo come echo e printf differiscono quando scrivono stringhe sul terminale.

echo here are some words
printf here are some words

Utilizzo di echo e printf con parole senza virgolette

Annuncio

Il echo comando 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, da avere printf agire su tutte le parole, devono essere citate.

echo here are some words
printf "here are some words"

Usando echo e printf con le parole citate

Va meglio. Abbiamo tutte le parole in fase di stampa ma ancora non riceviamo una nuova riga. Questo perché con printf ottieni una nuova linea solo se ne chiedi una. Potrebbe sembrare una seccatura ma ti consente di decidere se includerne uno o meno. Causare printf per emettere una nuova linea, è necessario includere “n” nella tua stringa. Questa è la sequenza di escape “newline”.

echo here are some words
printf "here are some wordsn"

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

A volte userai una nuova riga e altre volte no. Ecco un caso in cui uno printf istruzione usa una nuova riga e l’altra no.

printf "How-To " && printf "Geekn"

Utilizzo di due printfs per creare una singola riga di testo

Perché il primo printf non stampa una nuova riga, l’output della seconda printf è 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.

IMPARENTATO: 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 di attuale linea.

printf "Honey is the root of all evilrMoneyn"

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

Annuncio

Il printf comando elabora il suo input da sinistra a destra. La stringa viene stampata come testo normale fino a printf incontra il “r” carattere di fuga. Il cursore di output viene riportato all’inizio della riga corrente.

L’elaborazione della stringa riprende con la lettera immediatamente dietro il “r” carattere. Elaborazione delle cause rimanenti printf per stampare “Denaro”, sovrascrivendo la parola “Miele”.

Le virgolette “"” è usato per citare le stringhe e la barra rovesciata “Il carattere ” indica le sequenze di escape. Se si desidera stampare questi caratteri, è necessario eseguire l’escape con una barra rovesciata. Questo dice printf trattarli come caratteri letterali.

printf "This is a tTab, this is a quotation mark ", and this \ is a Backslashn"

Caratteri di escape in modo che vengano trattati alla lettera

Utilizzo di variabili

Utilizzo di variabili con printf è molto simile al loro utilizzo con echo . Per includere una variabile, come questa variabile di ambiente, anteponila con il simbolo del dollaro “$” come di solito.

printf "Home directory: $HOMEn"

Utilizzo di printf con una variabile di ambiente

IMPARENTATO: 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 printf che tipo di argomento aspettarsi, come stringhe, numeri interi o caratteri.

Annuncio

Questi sono gli identificatori di formato più comuni. Sono tutti preceduti da una percentuale”%” cartello. Per stampare un segno di percentuale, usi insieme due segni di 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.
  • %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 "How-To %sn" "Geek"
printf "%s%s %sn" "How" "-To" "Geek"

Mostra printf che accetta "troppi" argomenti

La stringa di formato nel primo comando include del testo proprio. Passiamo la stringa “Geek” come argomento a printf. È abbinato e stampato da “%s” identificatore di formato. 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 stringa vengono utilizzati da ciascuno dei “%s” specificatori di formato a loro volta. Ancora una volta, in C, devi inserire una virgola tra ogni argomento tranne Bash printf dimentichiamolo.

Per stampare diversi tipi di argomenti è sufficiente utilizzare l’identificatore di formato appropriato. Ecco una rapida routine di conversione dei numeri creata utilizzando printf. Stamperemo il valore 15 in notazione decimale, ottale ed esadecimale.

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

usando printf per stampare valori numerici in diverse notazioni di base

Riduciamolo un po’ in modo che l’esempio sia meno disordinato.

printf "Hex: %xn" 15

Stampa di un valore esadecimale

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 ottenerlo usando l’identificatore di formato esadecimale maiuscolo “%X” e inserendo un identificatore di larghezza tra il segno di percentuale “%” e il “X” carattere.

Annuncio

Questo dice printf la larghezza del campo in cui deve essere stampato l’argomento. Il campo viene riempito con spazi. Con questo formato, i valori a due cifre verrebbero stampati senza alcun riempimento.

printf "Hex: %2Xn" 15

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

Ora otteniamo un valore maiuscolo, stampato con uno spazio iniziale. Possiamo fare printf riempi il campo con zeri anziché spazi mettendo uno zero davanti ai due:

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 impostare il numero di punti decimali da includere nell’output.

printf "Floating point: %08.3fn" 9.243546

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

Ciò semplifica la produzione di tabelle dei risultati con output ben allineato. Questo comando successivo dimostra 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 finché 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, argomenti extra in printf le chiamate di funzione vengono ignorate.

printf "Float: %8.3fn" 9.243546 23.665 8.0021

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

È 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 %dn" "coats" 7 "shoes" 22 "Umbrellas" 3

Usando il modificatore di larghezza con le stringhe

Per impostazione predefinita, i valori sono giustificati a destra nei rispettivi campi. Per giustificarli a sinistra, usa un segno meno “-” subito dietro la percentuale “%” cartello.

printf "%-10s %d" "coats" 7 "shoes" 22 "Umbrellas" 3

Utilizzo di uno specificatore di larghezza giustificato a sinistra con stringhe

Annuncio

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 larghezza. Non come viene troncata la parola “Ombrelli”.

printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "coats" "shoes" "Umbrellas"

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

L’identificatore di larghezza può anche essere passato come an discussione. Usa un asterisco “*” invece di un identificatore numerico e passare la larghezza come argomento intero.

printf "%*sn" 20 "Rightmost" 12 "Middle" 5 "leftmost"

Passando l'identificatore di larghezza come argomento a printf

Altri trucchi e stranezze

Gli identificatori di formato all’interno della stringa di formato funzioneranno con valori del tipo appropriato, sia che siano forniti sulla riga di comando come argomenti regolari sia che siano generati come output di un espressione.

Questo stampa la somma di due numeri:

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

Stampa della somma di due numeri

Questo comando stampa il numero di directory nella directory di lavoro corrente:

printf "There are %d directoriesn" $(ls -d */ | wc -l)

Conteggio directory con printf

Questo printf comando stampa una stringa restituita da una chiamata a un altro comando.

printf "Current user: %sn" $(whoami)

Stampa dell'output da un altro comando

Se un identificatore di formato stringa “%s” non viene fornito con un argomento printf non stampa nulla.

printf "One: %s two: %sn" "Alpha"

Come printf gestisce gli argomenti di stringa mancanti

Annuncio

Se un identificatore di formato stringa “%s” viene fornito per errore un valore numerico, lo stampa come se fosse una stringa e non si lamenta. Non provare questo con il C printf— accadranno cose molto brutte. Il tuo programma probabilmente andrà in crash. Ma il Bash printf lo gestisce senza lamentarsi.

printf "One: %s two: %sn" "Alpha" 777

Come printf accetta silenziosamente interi come valori di stringa

Se un identificatore di formato intero “%d” non riceve alcun argomento, stamperà zero.

printf "Integer: %dn"

Come printf gestisce gli argomenti interi mancanti

Se un identificatore di formato intero “%d” riceve un argomento stringa per errore, Bash stamperà un messaggio di errore e printf stamperà zero.

printf "Integer: %dn" "Seven"

Come printf tratta le stringhe fornite invece degli argomenti interi

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 "The Euro symbol: u20ACn"

Stampa di un valore Unicode con escape

Per includere sequenze di escape in discussione stringhe, è necessario utilizzare “%b” identificatore di formato nella stringa di formato, non in “%s” identificatore di formato stringa.

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

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

Il primo printf non elabora il valore Unicode e non riconosce la sequenza di escape di nuova riga. Il secondo printf l’istruzione utilizza il “%b” identificatore di formato. Ciò gestisce correttamente il carattere Unicode e viene stampata una nuova riga.

IMPARENTATO: Quali sono le codifiche dei caratteri come ANSI e Unicode e in che cosa differiscono?

Cavalli per Corsi

A volte tutto ciò che devi fare è echo del testo nella 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-" "that's all folks.n"

Articoli correlati

Ultimi articoli