Cum să utilizați comanda Bash printf pe Linux
Publicat: 2022-06-25 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ă.
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
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"
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"
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”
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”
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”
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"
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"
Ș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
Să o tăiem puțin înapoi, astfel încât exemplul să fie mai puțin aglomerat.
printf „Hex: %x\n” 15
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
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
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
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
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
Î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
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"
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”
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))
Această comandă tipărește numărul de directoare din directorul de lucru curent:
printf „Există %d directoare\n” $(ls -d */ | wc -l)
Această comandă printf
afișează un șir returnat de la un apel către o altă comandă.
printf „Utilizator actual: %s\n” $(whoami)
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”
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
Dacă un specificator de format întreg „ %d
” nu primește niciun argument, va afișa zero.
printf „Număr întreg: %d\n”
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”
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”
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”
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"