Inhoudsopgave
ToggleInvoering
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
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"
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"
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"
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 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"
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"
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"
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
Laten we het een beetje inkorten om het voorbeeld minder rommelig te maken.
printf "Hex: %xn" 15
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
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
Met de precisiespecificatie kunt u specificeren hoeveel decimalen in de uitvoer moeten worden opgenomen.
printf "Floating point: %08.3fn" 9.243546
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
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
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
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"
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"
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))
Het aantal mappen in de huidige werkdirectory wordt afgedrukt met deze opdracht:
printf "Er zijn %d-mappen" $(ls -d */ | wc -l)
De opdracht printf drukt een tekenreeks af die is geretourneerd door een ander programma.
printf "Huidige gebruiker: %sn" $(whoami)
Als de specificatie van de tekenreeksindeling "procent s" niet wordt gegeven met een argument, retourneert printf null.
printf "Een: %s twee: %sn" "Alpha"
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
Als de specificatie van het gehele getal “% d” geen argument krijgt, wordt nul afgedrukt.
printf "Geheel getal: %dn"
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"
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"
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 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"
- Hoe Kali Linux te installeren op elk Android-apparaat zonder root
- Een pdf-bestand opnemen in een Google-document
- Hoe het gemiddelde te berekenen in Google Spreadsheets
- Afzonderlijke bestanden en mappen terugdraaien in Git
- Hoe Windows 11 te activeren
- Hoe alinea-einden in Google Docs in bulk te verwijderen