In questo articolo, spiegherò l'utilizzo di base di Bash printf comando con esempi in Linux. Entro la fine di questo articolo, ti sentirai a tuo agio nell'usare il comando printf nello scripting della shell Bash.
Comando Bash printf
Ben offre due tipi di comandi che possono essere utilizzati per stampare l'output sul terminale. Uno è l'eco comando che viene utilizzato principalmente per questo scopo. Il secondo è il printf comando.
Printf
è simile alla funzione printf in C lingua ma con un proprio insieme di caratteristiche. La principale differenza tra echo
e printf
il comando è quello printf
offre formattazione e funzionalità aggiuntive rispetto a echo
comando.
Se non hai utilizzato echo
comando prima, abbiamo un articolo dettagliato a riguardo a cui dovresti dare un'occhiata.
- Comando Bash Echo spiegato con esempi in Linux
Printf
è una shell integrata, ma puoi anche trovare un comando esterno per printf
. Builtin ha la precedenza sul comando esterno. Puoi ottenere queste informazioni eseguendo il type
comando come mostrato di seguito.
$ type -a printf printf is a shell builtin printf is /usr/bin/printf printf is /bin/printf
Per maggiori dettagli su type
comando, fare riferimento alla seguente guida:
- Esercitazione sui comandi di tipo con esempi per principianti
Se desideri eseguire la versione esterna di printf
, devi puntare al percorso completo della directory in cui risiede il file binario.
$ printf "Hello World\n" # SHELL BUILTIN
$ /usr/bin/printf "Hello World\n" # EXTERNAL VERSION OF PRINTF
Visualizza la guida di Bash printf
Come ho detto nella sezione precedente, printf
è bash integrato. Devi aprire il bash
man page e vai alla printf
sezione.
$ man bash
/printf → presss
Puoi anche eseguire il comando seguente che visualizzerà la sezione della guida di printf
dal bash
pagina man.
$ man bash | less --pattern='^ *printf +['
Forma base del comando printf
In tutti gli esempi, confronterò printf
con echo
comando per capire la comunanza.
Di seguito è riportato il formato per il printf
comando:
printf [-v var] format [arguments]
Gli argomenti devono essere passati a printf
altrimenti fallirà come mostrato nell'immagine qui sotto.
$ printf
$ echo $?
Passa un argomento ed esegui printf
comando di nuovo. Dall'esempio seguente puoi vedere che ho aggiunto \n che è il carattere di nuova riga. Per impostazione predefinita, printf
non aggiungerà una nuova riga come echo
comando, quindi devi aggiungere \n
.
$ printf "Linux is fun to work with" # WITHOUT NEW LINE
$ printf "Linux is fun to work with\n" # WITH NEW LINE
Variabili e interpretazione dei comandi
Puoi racchiudere qualsiasi variabile o eseguire comandi all'interno di printf
dichiarazione. Questo comportamento è simile a echo
comando.
$ VAR1="Linux"
$ printf "$VAR1 is fun to work with\n"
Lettura consigliata:
- Scripting Bash:variabili spiegate con esempi
Comportamento tra virgolette singole e doppie
Quando racchiudi i tuoi argomenti tra virgolette singole, la variabile e il comando verranno trattati come testo normale. Questo è lo stesso comportamento in echo
comando anche. Devi racchiudere gli argomenti tra virgolette se vuoi che la variabile e il comando vengano espansi.
$ printf '$VAR1 is fun to work with\n'
$ printf 'Today date = $(date)\n'
Quando passi argomenti senza virgolette, printf
considererà solo la prima parola come argomento e la stamperà. Quindi usando le virgolette intorno a printf
è necessario.
$ printf Today date = $(date)\n
Reindirizzamento e pipe dell'output
Per impostazione predefinita, printf
invierà le uscite a stdout (terminale). Puoi reindirizzare l'output a un file utilizzando l'operatore di reindirizzamento oppure combinalo con l'operatore pipe per ulteriore elaborazione.
# PRINT TO STDOUT $ printf "Today date = $(date)\n"
# REDIRECT TO A FILE $ printf "Today date = $(date)\n" > /tmp/tdy.txt $ cat /tmp/tdy.txt
# PIPE $ printf "Today date = $(date)\n" | grep -i -o IST
Lettura correlata:
- Il reindirizzamento di Bash spiegato con esempi
Assegnazione dell'output a una variabile
A volte potresti voler memorizzare il printf
output su una variabile e usarla in seguito per alcune elaborazioni. Normalmente eseguirai printf
racchiuso tra parentesi che eseguirà il comando e assegnerà l'output a una variabile.
$ ZONE=$(printf "Today date = $(date)\n" | grep -i -o IST)
$ printf $ZONE
In alternativa, puoi usare -v
flag insieme a printf
per memorizzare l'output in una variabile. Devi passare il nome della variabile dopo -v
bandiera.
$ printf -v TIME "Today date = $(date)\n" $ echo $TIME
Dichiarazione printf multilinea
Quando hai più di una riga da stampare, puoi racchiudere il testo tra virgolette. Allo stesso modo, se hai una riga enorme da stampare come riga singola e desideri scrivere la riga su più righe per una migliore leggibilità del codice, puoi utilizzare una barra rovesciata alla fine di ogni riga in cui la riga successiva sarà considerata come un continuazione alla riga precedente.
$ printf "\n I am running PoP_OS
It is a great OS
With Great features\n"
$ printf "I am running pop_os \
It is a great OS \
With Great features\n"
Caratteri con escape barra rovesciata
Puoi utilizzare i seguenti caratteri con escape barra rovesciata in printf
.
- Carattere di nuova riga (\n)
- Scheda Orizzontale (\t) e Scheda Verticale (\v)
- Carattere backspace (\b)
- Ritorno di trasporto (\r)
Discutiamo uno per uno con esempi.
Carattere di nuova riga (\n)
Abbiamo già visto il carattere della nuova riga (\n
) in tutte le sezioni precedenti. Carattere di nuova riga (\n
) aggiungerà una nuova riga.
$ printf "Today date = $(date)\n"
Scheda orizzontale (\t) e verticale (\v)
I caratteri di tabulazione orizzontale e verticale vengono utilizzati per aggiungere spazi di tabulazione al tuo printf
argomenti.
$ printf "Today date \t $(date)\n" # HORIZONTAL TAB
$ printf "Today date \v $(date)\n" # VERTICAL TAB
Carattere backspace (\b)
Carattere backspace (\b
) rimuoverà una lettera. È come premere il tasto Backspace dalla nostra tastiera.
$ printf "It's a rain\by day..\n"
Ritorno di trasporto (\r)
Il cursore viene riportato alla prima posizione quando il ritorno a capo (\r
) viene utilizzato. Qualunque cosa venga dopo \r
sostituirà i caratteri dalla prima posizione.
$ printf "It's a rain\by\r day..\n"
Esci dal carattere barra rovesciata (\)
Se desideri eseguire l'escape dei caratteri speciali (\n
, \t
, \v
, \b
, \r
) e trattalo come una stringa, quindi anteponilo con doppie barre rovesciate (\\
).
$ printf "It's a rain\\by\\r day..\n"
Qualunque cosa tu abbia visto fino ad ora, puoi trovare lo stesso insieme di operazioni in echo
comando anche. Se conosci già l'echo
comando, a questo punto ti saresti trovato molto a tuo agio con printf
comando anche.
Specificatori di formato Printf
Gli specificatori di formato sono un modo per sostituire il valore in printf
invece di codificare il valore in printf
. Ci sono molte lettere che vengono utilizzate per la sostituzione e ogni lettera rappresenta un particolare tipo di dati. Quando si utilizza uno specificatore, è necessario anteporre un %
simbolo. Vediamo alcuni degli identificatori di formato comunemente usati.
Identificatore di stringa (%s)
Se vuoi inserire delle stringhe all'interno di printf
, devi usare %s
. Dai un'occhiata all'esempio qui sotto. Ho un printf
dichiarazione e voglio sostituire il valore "United" all'interno del printf
. Quindi %s
viene utilizzato che è un identificatore di stringa e quando esegui il comando il valore "united" verrà sostituito al posto di %s
.
$ printf "++ Manchester %s has a strong lineup this season" "United"
Puoi passare tutti gli argomenti di sostituzione che desideri e devi utilizzare lo stesso numero di specificatori all'interno dell'argomento.
$ printf "++ %s %s has a strong lineup this %s" "Manchester" "United" "season"
Cosa succede se vengono utilizzati meno specificatori e più argomenti?
Dai un'occhiata all'esempio qui sotto. Ho usato solo uno specificatore all'inizio e ho passato tre argomenti (stringhe) da sostituire. Il modo printf
tratta questo è, inizierà a sostituire il primo argomento nel primo specificatore e l'argomento successivo verrà nuovamente passato al primo specificatore poiché non ci sono altri specificatori. In questo modo si verificheranno tre sostituzioni che in realtà non sono corrette e il risultato che vogliamo.
$ printf "++ %s United has a strong lineup this Season\n" "Manchester" "United" "season"
Ci sono alcuni casi d'uso in cui questo comportamento ha senso. Dai un'occhiata all'esempio qui sotto. Desidero stampare un messaggio di benvenuto per alcuni giocatori e passare i loro nomi come argomenti. Normalmente è possibile memorizzare l'elenco dei nomi in un array e scorrere l'array e stampare il messaggio. Ma questo è un modo efficace per ottenere il risultato evitando l'uso di loop.
$ printf "++ Welcome %s to manchester united\n" "Ronaldo" "Varane" "Jadon Sancho\n" ++ Welcome Ronaldo to manchester united ++ Welcome Varane to manchester united ++ Welcome Jadon Sancho to manchester united
Intero decimale con segno (%d) e numero intero decimale senza segno (%u)
Per sostituire i numeri interi separati, usa %d
.
$ printf ">> Welcome %s to manchester united - You get shirt number - %d\n" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25
Per sostituire numeri interi senza segno, usa %u
.
$ printf "UNSIGNED INTEGER = %u\n" 10
Se provi a sostituire qualsiasi tipo di dati diverso da intero, riceverai un errore.
$ printf ">> Ronaldo gets no %d\n" seven
Numero in virgola mobile (%f)
Per sostituire i numeri in virgola mobile, usa %f
.
$ printf "Integer 100 to floating-point %f\n" 100
Interpretazione della sequenza di escape della barra rovesciata
Puoi passare sequenze di escape barra rovesciata come argomenti e utilizzare %b
che interpreterà ed espanderà la sequenza di escape della barra rovesciata.
$ printf "Welcome to %b Manchester united %b" "\v" "\n"
Direttive di conversione Printf
Esistono modificatori di conversione opzionali che possono essere utilizzati per formattare il tuo printf
uscite.
%[flags][width][.precision]specifier
Modificatore di larghezza
Il modificatore di larghezza decide il numero minimo di caratteri nella conversione. Se il numero di caratteri è inferiore, gli spazi verranno preceduti come mostrato di seguito.
$ printf "%10s\n" "Ronaldo"
Se dai un'occhiata all'immagine sopra, lo specificatore (Ronaldo) è 7 caratteri e ho specificato che la larghezza è 10 . In questo caso, aggiungerà spazi per giustificare la larghezza 10 .
Puoi anche usare i modificatori di flag per giustificare l'allineamento o aggiungere zeri invece di spazi. Ad esempio, se l'output deve essere allineato a sinistra, puoi aggiungere un trattino (-
) modificatore di bandiera.
$ printf "%-10s\n" "Ronaldo"
Nel caso di valori interi ea virgola mobile, puoi sostituire lo spazio con zeri aggiungendo un modificatore di flag zero (0).
$ printf "%010d \n" 7
Modificatore di precisione
Questo è un parametro facoltativo che può essere utilizzato per decidere il numero di stringhe, numeri interi e posizioni a virgola mobile da stampare. Devi usare punto(.) seguito dal numero intero per decidere il numero di posizioni da stampare.
Dai un'occhiata all'esempio qui sotto. Sto usando uno specificatore di stringa e ho impostato il modificatore di precisione su quattro.
$ printf "%.7s\n" "Ronaldo has joined Manu"
Asterischi (*
) possono essere passati al posto dei valori interi di precisione. Gli asterischi accetteranno l'argomento per la precisione invece di codificare il valore della precisione.
$ printf "%.*s\n" 7 "Ronaldo has joined Manu"
Conclusione
Abbiamo trattato un bel po' di informazioni sul comando Bash printf in questo articolo. Per utilizzare il printf
comodamente, basta praticare tutti gli esempi forniti nell'articolo. Printf è molto più potente nella formattazione rispetto agli esempi che ho mostrato in questo articolo. Se hai dimestichezza con le basi, a seconda del caso d'uso puoi utilizzare printf
efficiente.
Lettura correlata:
- Scripting Bash:array indicizzato spiegato con esempi
- Scripting Bash:array associativo spiegato con esempi
- Scripting Bash:spiegazione del ciclo While e Until con esempi
- Scripting di Bash:il ciclo For viene spiegato con esempi
- Scripting Bash:funzioni spiegate con esempi
- Tutorial Bash Heredoc per principianti