Cum să utilizați comanda Bash printf pe Linux

Publicat: 2022-06-25
Un terminal Linux pe un fundal albastru.
fatmawati achmad zaenuri/Shutterstock.com

Comanda Bash printf vă permite să scrieți într-o fereastră de terminal Linux cu un control mai fin și mai multe opțiuni de formatare decât le oferă comanda echo . Chiar și ciudateniile lui printf pot fi utile.

Scrierea la un terminal

Este una dintre cele mai de bază părți ale interacțiunii cu un program. Programul scrie ceva pe ecran și tu îl citești. Chiar și ținând cont de convenția derivată de Unix și susținută de Linux conform căreia programele de linie de comandă sunt cât mai concise posibil - mulți scriu pe terminal doar dacă ceva nu merge bine. A spune utilizatorului ce se întâmplă, sau este pe cale să se întâmple sau tocmai s-a întâmplat este o primitivă de programare esențială.

Cum să utilizați comanda Echo pe Linux
LEGATE Cum să utilizați comanda Echo pe Linux

Shell-ul Bash are comanda echo care poate scrie text în fereastra terminalului. Poate gestiona variabile și afișează valorile acestora dacă sunt incluse în șir și îl puteți folosi în scripturi sau pe linia de comandă. Deci de ce există printf ? echo nu are în vedere chestia cu scrierea textului? Ei bine, printf oferă funcționalitate dincolo de actul simplu de a scrie șiruri în ferestrele terminalului. Vă permite să formatați rezultatul cu o mare flexibilitate și are și alte trucuri.

Comanda Bash printf este modelată pe funcția printf din limbajul C, dar există diferențe. Dacă cunoști C, va trebui să fii atent la aceste diferențe.

Scrierea șirurilor de caractere de bază

Să vedem cum diferă echo și printf atunci când scriu șiruri de caractere pe terminal.

 ecou iată câteva cuvinte
 printf iată câteva cuvinte 

Folosind echo și printf cu cuvinte fără ghilimele

Comanda echo tipărește toate cuvintele, dar printf tipărește doar primul cuvânt. De asemenea, nu există nicio linie nouă tipărită de printf . Ieșirea este îndreptată direct cu promptul de comandă. Dar, în primul rând, pentru ca printf să acționeze asupra tuturor cuvintelor, acestea trebuie citate.

 ecou iată câteva cuvinte
 printf "iată câteva cuvinte" 

Folosind echo și printf cu cuvinte citate

Asa e mai bine. Avem toate cuvintele tipărite, dar încă nu primim o nouă linie. Asta pentru că cu printf primești o linie nouă doar dacă o ceri. Ar putea părea o durere, dar vă permite să decideți dacă includeți unul sau nu. Pentru a determina printf să emită o nouă linie, trebuie să includeți „ \n ” în șirul dvs. Aceasta este secvența de evadare „newline”.

 ecou iată câteva cuvinte
 printf "iată câteva cuvinte\n" 

Folosind echo și printf cu cuvinte ghilimele și caracterul newline

Uneori vei folosi o linie nouă, iar alteori nu. Iată un caz în care o instrucțiune printf folosește o linie nouă, iar cealaltă nu.

 printf „Cum se face” && printf „Geek\n” 

Folosind două printfs pentru a crea o singură linie de text

Deoarece primul printf nu tipărește o linie nouă, rezultatul de la a doua printf este poziționat imediat după „How-To” și pe aceeași linie. Al doilea printf folosește \n pentru a imprima o nouă linie. Acest lucru face ca promptul de comandă să apară pe linia de sub textul tipărit.

LEGATE: Cum să procesați un fișier linie cu linie într-un script Linux Bash

Alte personaje de evadare

Iată câteva caractere de evadare pe care le puteți folosi. Ați văzut deja „ \n ” în acțiune.

  • \n : Se mută în jos la o linie nouă.
  • \r : Imprimă un retur de transport. Aceasta trimite cursorul de ieșire înapoi la începutul liniei curente.
  • \t : Imprimă un caracter tabulator.
  • \v : afișează un spațiu de tab-uri vertical.
  • \\ : Imprimă un caracter backslash.
  • \” : Tipărește un caracter ghilimeleu.
  • \b : Imprimă un caracter backspace.

Caracterul de evadare pentru întoarcerea căruciorului mută cursorul înapoi la începutul liniei curente .

 printf „Mierea este rădăcina tuturor relelor\rBanii\n” 

Folosind caracterul de întoarcere la cărucior pentru a reveni la începutul liniei

Comanda printf își procesează intrarea de la stânga la dreapta. Șirul este tipărit ca text normal până când printf întâlnește caracterul de escape „ \r ”. Cursorul de ieșire este mutat înapoi la începutul liniei curente.

Procesarea șirului se reia cu litera imediat în spatele caracterului „ \r ”. Procesarea restului face ca printf să imprime „Bani”, suprascriind cuvântul „Miere”.

Ghilimelele „ " ” sunt folosite pentru a cita șiruri, iar caracterul backslash „ \ ” denotă secvențe de escape. Dacă doriți să imprimați aceste caractere, trebuie să le escape cu o backslash. Acest lucru îi spune printf să le trateze ca caractere literale.

 printf „Acesta este un \tTab, acesta este un ghilimele \”, iar acest \\ este o bară oblică inversă\n” 

Evadând personaje, astfel încât acestea să fie tratate la propriu

Utilizarea variabilelor

Utilizarea variabilelor cu printf este foarte asemănătoare cu utilizarea lor cu echo . Pentru a include o variabilă, cum ar fi această variabilă de mediu, precedați-o cu semnul dolar „ $ ”, ca de obicei.

 printf "Directorul principal: $HOME\n" 

Folosind printf cu o variabilă de mediu

LEGATE: Cum să lucrați cu variabile în Bash

Formatați șiruri

Șirurile de format sunt șiruri care definesc formatul de ieșire. Furnizați text și alte valori ca argumente pentru șirul de format pe care să opereze.

Șirul de format poate include text, secvențe de escape și specificatori de format . Specificatorii de format îi spun printf la ce tip de argument să se aștepte, cum ar fi șiruri de caractere, numere întregi sau caractere.

Aceștia sunt cei mai comuni specificatori de format. Toate sunt precedate de semnul procentual „ % ”. Pentru a imprima un semn de procent, utilizați semnele de două procente împreună „ %% ”.

  • %s : Imprimă un șir.
  • %c : Imprimă un singur caracter.
  • %d : Imprimă un număr întreg.
  • %f : afișează un număr în virgulă mobilă.
  • %u : Imprimă un întreg fără semn.
  • %o : Imprimă o valoare în octal.
  • %x : Tipărește o valoare în hexazecimal, cu litere mici.
  • %X : Imprimă o valoare în hexazecimal, cu majuscule.
  • %e : Tipărește un număr în virgulă mobilă în notație științifică, cu litere mici.
  • %E : Tipărește un număr în virgulă mobilă în notație științifică, cu majuscule.
  • %% : Imprimă un simbol procentual „%”.
 printf „Cum se face %s\n” „Tocilar”
 printf "%s%s %s\n" "Cum" "-Pentru" "Geek" 

Se afișează printf care acceptă „prea multe” argumente

Șirul de format din prima comandă include un text propriu. Trecem șirul „Geek” ca argument pentru printf . Este potrivit și tipărit de către specificatorul de format „ %s ”. Rețineți că există doar un spațiu între șirul de format și șirul de argument. În C, veți avea nevoie de o virgulă pentru a le separa, dar cu versiunea Bash a printf , este suficientă utilizarea unui spațiu.

Al doilea șir de format conține doar specificatori de format și secvența de escape newline. Cele trei argumente șir sunt consumate de fiecare dintre specificatorii de format „ %s ” pe rând. Din nou, în C, trebuie să puneți o virgulă între fiecare argument, dar Bash printf ne lasă să uităm de asta.

Pentru a imprima diferite tipuri de argumente, pur și simplu utilizați specificatorul de format corespunzător. Iată o rutină de conversie rapidă a numerelor construită folosind printf . Vom tipări valoarea 15 în notație zecimală, octală și hexazecimală.

 printf „Dec: %d\nOct: %o\nHex: %x\n” 15 15 15 

folosind printf pentru a imprima valori numerice în diferite notații de bază

Să o tăiem puțin înapoi, astfel încât exemplul să fie mai puțin aglomerat.

 printf „Hex: %x\n” 15 

Imprimarea unei valori hexazecimale

Cei mai mulți dintre noi sunt obișnuiți să vedem valorile hexazecimale cu majuscule și cu valori mai mici de 0x10 tipărite cu un zero la început. Putem realiza acest lucru utilizând specificatorul de format hexazecimal majuscule „ %X ” și punând un specificator de lățime între semnul de procent „ % ” și caracterul „ X ”.

Aceasta îi spune printf lățimea câmpului în care ar trebui să fie tipărit argumentul. Câmpul este umplut cu spații. Cu acest format, valorile din două cifre vor fi tipărite fără nicio umplutură.

 printf „Hex: %2X\n” 15 

imprimarea unei valori hexazecimale cu majuscule într-un câmp de 2 caractere

Acum obținem o valoare majusculă, tipărită cu un spațiu de început. Putem face printf pad câmpul cu zerouri în loc de spații punând un zero în fața celor două:

 printf „Hex: %02X\n” 15 

imprimarea unei valori hexazecimale cu majuscule într-un câmp cu lățimea de 2 caractere completat cu zerouri

Specificatorul de precizie vă permite să setați numărul de puncte zecimale de inclus în rezultat.

 printf „Virgulă mobilă: %08.3f\n” 9.243546 

Utilizarea modificatorilor de lățime și precizie cu un număr în virgulă mobilă

Acest lucru facilitează producerea de tabele cu rezultate cu rezultate bine aliniate. Această comandă următoare demonstrează, de asemenea, o altă trăsătură a lui Bash printf . Dacă există mai multe argumente decât specificatorii de format, argumentele sunt introduse în șirul de format în loturi până când toate argumentele au fost epuizate. Mărimea lotului care este procesat la un moment dat este numărul de specificatori de format din șirul de format. În C, argumentele suplimentare din apelurile de funcție printf sunt ignorate.

 printf „Float: %8.3f\n” 9.243546 23.665 8.0021 

Utilizarea modificatorilor de lățime și precizie pentru a crea o masă îngrijită

Puteți utiliza specificatorii de lățime și precizie și cu șiruri. Această comandă tipărește șirurile într-un câmp lat de 10 caractere.

 printf „%10s %d\n” „paltoane” 7 „pantofi” 22 „Umbrele” 3 

Folosind modificatorul de lățime cu șiruri

În mod implicit, valorile sunt justificate la dreapta în câmpurile lor. Pentru a le justifica la stânga, utilizați semnul minus „ - ” imediat în spatele semnului „ % ”.

 printf „%-10s %d” „paltoane” 7 „pantofi” 22 „Umbrele” 3 

Folosind un specificator de lățime justificat la stânga cu șiruri

Specificatorul de precizie poate fi utilizat pentru a seta numărul maxim de caractere care sunt imprimate. Folosim caracterele două puncte „ : ” pentru a afișa limitele câmpului de lățime. Nu cum este trunchiat cuvântul „umbrele”.

 printf ":%10.6s:\n" "paltoane" "pantofi" "Umbrele"
 printf ":%-10.6s:\n" "paltoane" "pantofi" "umbrele" 

Utilizarea modificatorului de precizie pentru a limita numărul de caractere care sunt tipărite dintr-un șir

Specificatorul de lățime poate fi chiar transmis ca argument . Utilizați un asterisc „ * ” în loc de un specificator numeric și transmiteți lățimea ca argument întreg.

 printf „%*s\n” 20 „Cel mai din dreapta” 12 „Mijloc” 5 „Cel mai din stânga” 

Trecerea specificatorului de lățime ca argument pentru printf

Alte trucuri și ciudatenii

Specificatorii de format din șirul de format vor funcționa cu valori de tipul adecvat, indiferent dacă sunt furnizate pe linia de comandă ca argumente obișnuite sau dacă sunt generate ca rezultat al unei expresii .

Aceasta imprimă suma a două numere:

 printf "23+32=%d\n" $((23+32)) 

Tipărirea sumei a două numere

Această comandă tipărește numărul de directoare din directorul de lucru curent:

 printf „Există %d directoare\n” $(ls -d */ | wc -l) 

Numărarea directoarelor cu printf

Această comandă printf afișează un șir returnat de la un apel către o altă comandă.

 printf „Utilizator actual: %s\n” $(whoami) 

Imprimarea rezultatului de la o altă comandă

Dacă un specificator de format de șir „ %s ” nu este furnizat cu un argument printf nu tipărește nimic.

 printf „Unul: %s doi: %s\n” „Alfa” 

Cum se ocupă printf cu argumentele șir lipsă

Dacă un specificator de format de șir „ %s ” este furnizat cu o valoare numerică din greșeală, acesta îl tipărește ca și cum ar fi un șir și nu se plânge. Nu încercați acest lucru cu C printf — se vor întâmpla lucruri foarte rele. Probabil că programul tău se va bloca. Dar Bash printf se ocupă de asta fără să se plângă.

 printf "Unul: %s doi: %s\n" "Alpha" 777 

Cum printf acceptă în tăcere numerele întregi ca valori de șir

Dacă un specificator de format întreg „ %d ” nu primește niciun argument, va afișa zero.

 printf „Număr întreg: %d\n” 

Cum printf gestionează argumentele întregi lipsă

Dacă un specificator de format întreg „ %d ” primește un argument șir din greșeală, Bash va imprima un mesaj de eroare și printf va imprima zero.

 printf „Număr întreg: %d\n” „Șapte” 

Cum tratează printf șirurile care sunt furnizate în loc de argumente întregi

Simbolurile incomode pot fi generate folosind numărul lor Unicode sau „punctul de cod”. Acestea sunt scăpate folosind litera „u” urmată de valoarea lor Unicode.

 printf „Simbolul euro: \u20AC\n” 

Se imprimă o valoare Unicode escape

Pentru a include secvențe de escape în șirurile de argument , trebuie să utilizați specificatorul de format „ %b ” în șirul de format, nu specificatorul de format de șir „ %s ”.

 printf „%s” „\u20AC\n”
 printf „%b” „\u20AC\n” 

Folosind el %b specificator de format pentru a gestiona secvențele de escape în argumente șir

Prima instrucțiune printf nu procesează valoarea Unicode și nu recunoaște secvența de escape newline. A doua instrucțiune printf folosește specificatorul de format „ %b ”. Acesta gestionează corect caracterul Unicode și este tipărită o nouă linie.

RELATE: Ce sunt codificările de caractere precum ANSI și Unicode și cum diferă?

Cai pentru curse

Uneori, tot ce trebuie să faceți este să echo un text în fereastra terminalului. Dar atunci când trebuie să aplicați poziționare și formatare, printf este instrumentul potrivit pentru lucrare.

 printf "%b" "Tha-" "tha-" "tha-" "asta sunt tot oameni buni.\n"