Huis Studie Hoe de Bash printf-opdracht op Linux te gebruiken

Hoe de Bash printf-opdracht op Linux te gebruiken

door Frank
Gepubliceerd: Laatst geupdate op

Invoering

De opdracht Bash printf geeft je meer flexibiliteit en opmaakkeuzes dan de echo-opdracht bij het schrijven naar een Linux-terminalvenster. Zelfs de eigenaardigheden van printf kunnen nuttig zijn.

Het is een van de meest fundamentele aspecten van het werken met software. U leest wat de applicatie op het scherm heeft geschreven. Zelfs met de van Unix afgeleide en door Linux ondersteunde gewoonte om opdrachtregelprogramma's zo kort mogelijk te houden, schrijven veel toepassingen alleen naar de terminal als er iets misgaat. Een cruciale programmeerbasis is het informeren van de gebruiker over wat er gebeurt, gaat gebeuren of recentelijk heeft plaatsgevonden.

Het echo-commando in de Bash-shell kan tekst naar het terminaldisplay schrijven. U kunt het gebruiken in scripts of op de opdrachtregel, en het kan variabelen verwerken en hun waarden weergeven als ze in de tekenreeks voorkomen. Dus, wat is het punt van printf? Is het schrijven van tekst niet iets waar echo voor zorgt? Printf daarentegen biedt meer dan alleen de mogelijkheid om strings naar terminalvensters te schrijven. Het geeft je veel veelzijdigheid als het gaat om het formatteren van de uitvoer, en het heeft een paar extra trucjes in petto.

Het printf-commando in Bash is vergelijkbaar met de printf-functie in C, maar er zijn verschillende wijzigingen. U moet op de hoogte zijn van de wijzigingen als u bekend bent met C.

Eenvoudige tekenreeksen maken

Laten we eens kijken naar de verschillen tussen echo en printf als het gaat om het schrijven van strings naar de terminal.

echo hier zijn enkele woorden
printf hier zijn enkele woorden

Echo en printf gebruiken met woorden zonder aanhalingstekens

Terwijl echo alle woorden afdrukt, publiceert printf gewoon de eerste. Printf drukt ook geen nieuwe regel af. De uitvoer is pal in het midden van de opdrachtprompt. Maar eerst en vooral moeten alle woorden worden geciteerd zodat printf ernaar kan handelen.

echo hier zijn enkele woorden
printf "hier zijn enkele woorden"

Echo en printf gebruiken met geciteerde woorden

Dat is een stap vooruit. We hebben alle woorden afgedrukt, maar we wachten nog steeds op een nieuwe regel. Dat komt omdat printf alleen een nieuwe regel afdrukt als u er specifiek om vraagt. Dit klinkt misschien onhandig, maar het stelt u in staat om te kiezen of u er een wilt toevoegen of niet. U moet "n" in uw tekenreeks toevoegen om printf een nieuwe regel te laten uitzenden. De escape-reeks "newline" wordt hier gebruikt.

echo hier zijn enkele woorden
printf "hier zijn enkele woordenn"

Echo en printf gebruiken met aanhalingstekens en het teken van de nieuwe regel

U zult soms een nieuwe regel gebruiken en andere niet. In dit voorbeeld gebruikt de ene printf-opdracht een nieuwe regel en de andere niet.

printf "How-To" && printf "Geekn"

Twee printfs gebruiken om één regel tekst te maken

Omdat de eerste printf geen nieuwe regel afdrukt, wordt de uitvoer van de tweede printf op dezelfde regel geplaatst als "How-To". Om een nieuwe regel af te drukken, gebruikt de tweede printf n. De opdrachtprompt wordt nu weergegeven op de regel onder de afgedrukte tekst.

Personages die de gevangenneming zijn ontgaan

Hier zijn enkele extra tekens die als ontsnappingen kunnen worden gebruikt. Je hebt eerder gezien hoe "n" werkt.

n: Schakelt over naar een nieuwe regel.
r: Deze opdracht drukt een regelterugloop af. De uitvoercursor keert terug naar het begin van de huidige regel.
t: Deze opdracht drukt een tab-teken af.
v: voegt een verticale tabruimte toe aan de pagina.
\: Er wordt een backslash-teken afgedrukt.
“: Geeft een aanhalingsteken weer.
b: Geeft het backspace-teken weer.

Het escape-teken voor de regelterugloop wordt gebruikt om de cursor terug te brengen naar het begin van de huidige regel.

printf "Honing is de wortel van alle kwaadrGeld"

Het terugloopteken gebruiken om terug te gaan naar het begin van de regel

Het printf-commando leest van links naar rechts. Totdat printf het escape-teken "r" detecteert, wordt de tekenreeks geschreven als gewone tekst. De uitgangscursor wordt verplaatst naar het begin van de huidige regel.

Met de letter direct onder het teken "r", gaat de verwerking van de tekenreeks verder. De rest zorgt ervoor dat printf "Geld" afdrukt, wat de uitdrukking "Honing" vervangt.

Het backslash-teken "" geeft ontsnappingsreeksen aan, terwijl het aanhalingsteken """ wordt gebruikt om tekenreeksen aan te halen. Als u deze tekens wilt afdrukken, gebruikt u een backslash om ze te escapen. Dit instrueert printf dat ze moeten worden behandeld als letterlijke tekens.

printf "Dit is een tTab, dit is een aanhalingsteken ", en dit \ is een Backslashn"

Ontsnappende karakters zodat ze letterlijk worden behandeld

Variabelen in actie

Het gebruik van variabelen met printf lijkt veel op het gebruik van variabelen met echo. Om een variabele, zoals deze omgevingsvariabele, op te nemen, gebruikt u het dollarteken "$" zoals normaal ervoor.

printf "Thuismap: $HOMen"

Printf gebruiken met een omgevingsvariabele

Tekenreeksopmaak

Opmaakreeksen zijn tekenreeksen die het uitvoerformaat specificeren. U geeft de tekenreekstekst op en aanvullende waarden om mee te werken als argumenten.

Tekst, escape-reeksen en opmaakspecificaties kunnen allemaal in de opmaakreeks worden opgenomen.

De formaatspecificaties van Printf geven aan wat voor soort argument het moet accepteren, zoals tekenreeksen, cijfers of tekens.

De meest voorkomende formaatspecificaties worden hieronder weergegeven. Een procent " procent" -symbool gaat ze allemaal vooraf. U kunt een procentteken afdrukken door twee procenttekens "procent procent" te combineren.

  • %s: drukt een tekenreeks af.
  • %c: Drukt één teken af.
  • %d: drukt een geheel getal af.
  • %f: drukt een getal met drijvende komma af.
  • %u: drukt een geheel getal zonder teken af.
  • 1TP2Naar: drukt een waarde in octaal af.
  • %x: Prints a value in hexadecimaal, in kleine letters.
  • %X: drukt een waarde af in hexadecimaal, in hoofdletters.
  • %e: Drukt een getal met drijvende komma af in wetenschappelijke notatie, in kleine letters.
  • %E: Drukt een getal met drijvende komma af in wetenschappelijke notatie, in hoofdletters.
  • %%: Prints a percent “%” symbol.
printf "How-To %sn" "Geek"
printf "%s%s %sn" "Hoe" "-To" "Geek"

Toont printf die "te veel" argumenten accepteert

De format string van de eerste opdracht bevat enige eigen inhoud. De string "Geek" wordt als argument naar printf gestuurd. De formaatspecificatie "%s" komt overeen en drukt deze af. Tussen de format string en de argument string is er slechts een spatie. In C zou een komma nodig zijn om ze te scheiden, maar bij de Bash-versie van printf is een spatie voldoende.

Alleen formaatspecificaties en de nieuwe regel escape-reeks zijn opgenomen in de tweede formaattekenreeks. Elk van de "%s"-formaatspecificaties gebruikt op zijn beurt de drie stringparameters. Nogmaals, in C is een komma vereist tussen elke parameter, maar de Bash printf-functie stelt ons in staat om deze vereiste te negeren.

Gebruik gewoon de juiste formaatspecificatie om verschillende soorten argumenten uit te voeren. Hier is een eenvoudige op printf gebaseerde nummerconversiefunctie. In decimale, octale en hexadecimale notatie zullen we het getal 15 afdrukken.

printf "Dec: %dnOkt: %onHex: %xn" 15 15 15

printf gebruiken om numerieke waarden in verschillende basisnotaties af te drukken

Laten we het een beetje inkorten om het voorbeeld minder rommelig te maken.

printf "Hex: %xn" 15

Een hexadecimale waarde afdrukken

De meesten van ons zijn gewend om hexadecimale getallen weergegeven in hoofdletters te zien met waarden kleiner dan 0x10 voorafgegaan door een voorloopnul. We kunnen dit doen door een breedtespecificatie tussen het procentteken "%" en het "X"-teken te plaatsen en de hexadecimale hoofdletterspecificatie "% X" te gebruiken.

Dit specificeert de grootte van het veld waarin het argument naar printf moet worden afgedrukt. Er zijn spaties aan het veld toegevoegd. Tweecijferige getallen zouden in deze stijl worden gepresenteerd zonder enige opvulling.

printf "Hex: %2Xn" 15

een hexadecimale waarde afdrukken in hoofdletters in een veld met een breedte van 2 tekens

We hebben nu een waarde in hoofdletters met een voorloopspatie erop. Door een nul voor de twee te plaatsen, kunnen we printf het veld vullen met nullen in plaats van spaties:

printf "Hex: %02Xn" 15

een hexadecimale waarde afdrukken in hoofdletters in een veld met een breedte van 2 tekens opgevuld met nullen

Met de precisiespecificatie kunt u specificeren hoeveel decimalen in de uitvoer moeten worden opgenomen.

printf "Floating point: %08.3fn" 9.243546

Breedte- en precisie-modifiers gebruiken met een getal met drijvende komma

Dit maakt het maken van tabellen met resultaten met perfect uitgelijnde uitvoer een fluitje van een cent. Deze opdracht toont ook een andere eigenaardigheid van Bash printf. Als er meer argumenten zijn dan formaatspecificaties, worden de argumenten in batches in de formaattekenreeks ingevoerd totdat ze allemaal zijn opgebruikt. Het aantal formaatspecificaties in de formaatstring bepaalt de grootte van de batch die op een bepaald moment wordt verwerkt. Extra argumenten die naar de functie printf in C worden verzonden, worden genegeerd.

printf "Float: %8.3fn" 9.243546 23.665 8.0021

Breedte- en precisiemodifiers gebruiken om een nette tabel te maken

Strings kunnen ook gebruikmaken van de breedte- en precisiespecificaties. Met deze opdracht worden de tekenreeksen afgedrukt in een veld van 10 tekens.

printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3

De breedtemodifier gebruiken met strings

By default, values are right-justified in their fields. To left-justify them, use a minus sign “-” immediately behind the percent “%” sign.

printf "%-10s %d" "jassen" 7 "schoenen" 22 "Paraplu's" 3

Een links uitgelijnde breedtespecificatie gebruiken met tekenreeksen

Met de precisiespecificatie kunt u het maximale aantal tekens kiezen dat wordt afgedrukt. De dubbele punt “:” wordt gebruikt om de beperkingen van het breedteveld aan te geven. Niet op de manier waarop de term "paraplu's" wordt ingekort.

printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "jassen" "schoenen" "Paraplu's"

De precisiemodifier gebruiken om het aantal tekens te beperken dat vanaf een tekenreeks wordt afgedrukt

Zelfs als argument kan de breedtespecificatie worden gebruikt. Gebruik in plaats van een numerieke specificatie een asterisk "*" en geef de breedte op als een geheel getal.

printf "%*sn" 20 "meest rechtse" 12 "Midden" 5 "meest linkse"

De breedtespecificatie als argument doorgeven aan printf

Andere eigenaardigheden en gimmicks

De indelingsspecificaties in de indelingsreeks werken met waarden van het juiste type, of ze nu als gewone argumenten op de opdrachtregel worden geleverd of als resultaat van een expressie worden gemaakt.

Dit geeft het resultaat weer van het optellen van twee getallen:

printf "23+32=%dn" $((23+32))

De som van twee getallen afdrukken

Het aantal mappen in de huidige werkdirectory wordt afgedrukt met deze opdracht:

printf "Er zijn %d-mappen" $(ls -d */ | wc -l)

Mappen tellen met printf

De opdracht printf drukt een tekenreeks af die is geretourneerd door een ander programma.

printf "Huidige gebruiker: %sn" $(whoami)

De uitvoer van een andere opdracht afdrukken

Als de specificatie van de tekenreeksindeling "procent s" niet wordt gegeven met een argument, retourneert printf null.

printf "Een: %s twee: %sn" "Alpha"

Hoe printf omgaat met ontbrekende stringargumenten

Als er per ongeluk een numerieke waarde wordt gegeven voor de specificatie van de tekenreeksindeling '% s', wordt deze als een tekenreeks afgedrukt en wordt er niet geklaagd. Als je dit doet met de C printf, krijg je veel problemen. Uw software zal vrijwel zeker crashen. De Bash-printf daarentegen lijkt het niet erg te vinden.

printf "Een: %s twee: %sn" "Alpha" 777

Hoe printf in stilte gehele getallen als tekenreekswaarden accepteert

Als de specificatie van het gehele getal “% d” geen argument krijgt, wordt nul afgedrukt.

printf "Geheel getal: %dn"

Hoe printf omgaat met ontbrekende integerargumenten

Bash zal een foutmelding geven en printf zal nul afdrukken als de integer-indelingsspecificatie "% d" per ongeluk een string-invoer krijgt.

printf "Integer: %dn" "Zeven"

Hoe printf tekenreeksen behandelt die zijn opgegeven in plaats van integerargumenten

Onhandige symbolen kunnen worden gemaakt door hun Unicode-nummer in te voeren, ook wel een "codepunt" genoemd. De letter "u" wordt gebruikt om aan bepaalde tekens te ontsnappen, gevolgd door hun Unicode-waarde.

printf "Het eurosymbool: u20ACn"

Een ontsnapte Unicode-waarde afdrukken

Om escape-reeksen in argumentreeksen op te nemen, gebruikt u de formaatspecificatie "% b" in plaats van de tekenreeksindeling "% s" in de formaatreeks.

printf "%s" "u20ACn"
printf "%b" "u20ACn"

De %b-formaatspecificatie gebruiken om escape-reeksen in stringargumenten te verwerken

De initiële printf-opdracht herkent de escape-reeks van de nieuwe regel niet en verwerkt de Unicode-waarde niet. De formaatspecificatie "% b" wordt gebruikt in de tweede printf-opdracht. Het Unicode-teken wordt op de juiste manier verwerkt en er wordt een nieuwe regel weergegeven.

Paarden voor cursussen

Het kan zijn dat u af en toe wat tekst in het terminalvenster moet echoën. Printf is echter het ideale hulpmiddel voor de taak wanneer u enige positionering en opmaak moet toepassen.

printf "%b" "Tha-" "tha-" "tha-" "dat is alles mensen.n"

Dit vind je misschien ook leuk

Navhow is toegewijd om mensen over de hele wereld te leren hoe ze iets moeten doen.

 

Abonneren

De beste how-to-nieuwsbrief overal

©2020 Navhow, Alle rechten voorbehouden