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.
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
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"
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"
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"
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"
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"
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"
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.
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"
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
Riduciamolo un po’ in modo che l’esempio sia meno disordinato.
printf "Hex: %xn" 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 ottenerlo usando l’identificatore di formato esadecimale maiuscolo “%X
” e inserendo un identificatore di larghezza tra il segno di percentuale “%
” e il “X
” carattere.
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
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
L’identificatore di precisione consente di impostare il numero di punti decimali da includere nell’output.
printf "Floating point: %08.3fn" 9.243546
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
È 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
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
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"
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"
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))
Questo comando stampa il numero di directory nella directory di lavoro corrente:
printf "There are %d directoriesn" $(ls -d */ | wc -l)
Questo printf
comando stampa una stringa restituita da una chiamata a un altro comando.
printf "Current user: %sn" $(whoami)
Se un identificatore di formato stringa “%s
” non viene fornito con un argomento printf
non stampa nulla.
printf "One: %s two: %sn" "Alpha"
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
Se un identificatore di formato intero “%d
” non riceve alcun argomento, stamperà zero.
printf "Integer: %dn"
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"
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"
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"
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"