GNU/Linux >> Linux Esercitazione >  >> Linux

Scripting Bash – Spiegazione del comando Printf con esempi

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

Linux
  1. Bash HereDoc Tutorial con esempi

  2. Spiegazione del comando di taglio di Linux con 6 esempi

  3. Comando di spegnimento di Linux spiegato con esempi

  4. Comando Traceroute di Linux, spiegato con esempi

  5. '&&' vs. '&' con il comando 'test' in Bash

Bash Scripting – Array indicizzato spiegato con esempi

Il comando Tr in Linux spiegato con esempi

w Comando spiegato con esempi in Linux

Bash Scripting Part2 – Cicli For e While con esempi

Spiegazione del comando tee di Linux (con esempi)

Spiegazione del comando csplit di Linux (con esempi)