So verwenden Sie den Bash-printf-Befehl unter Linux

Veröffentlicht: 2022-06-25
Ein Linux-Terminal auf blauem Hintergrund.
fatmawati achmad zaenuri/Shutterstock.com

Mit dem Bash-Befehl printf können Sie mit einer feineren Steuerung und mehr Formatierungsoptionen in ein Linux-Terminalfenster schreiben, als der echo -Befehl bietet. Sogar die seltsamen Macken von printf können nützlich sein.

Schreiben auf ein Terminal

Es ist einer der grundlegendsten Teile der Interaktion mit einem Programm. Das Programm schreibt etwas auf den Bildschirm, und Sie lesen es. Selbst unter Berücksichtigung der von Unix abgeleiteten und von Linux aufrechterhaltenen Konvention von Befehlszeilenprogrammen, die so knapp wie möglich gehalten werden, schreiben viele nur auf das Terminal, wenn etwas schief geht. Dem Benutzer mitzuteilen, was gerade passiert, passieren wird oder gerade passiert ist, ist ein wesentliches Programmierelement.

So verwenden Sie den Echo-Befehl unter Linux
VERWANDTE Verwendung des Echo-Befehls unter Linux

Die Bash-Shell verfügt über den echo -Befehl, der Text in das Terminalfenster schreiben kann. Es kann Variablen verarbeiten und ihre Werte anzeigen, wenn sie in der Zeichenfolge enthalten sind, und Sie können es in Skripten oder in der Befehlszeile verwenden. Warum existiert printf überhaupt? Hat echo nicht die Sache mit dem Textschreiben abgedeckt? Nun, printf bietet Funktionen, die über das einfache Schreiben von Strings in Terminalfenster hinausgehen. Es ermöglicht Ihnen, die Ausgabe mit großer Flexibilität zu formatieren, und es hat auch andere Tricks.

Der Bash-Befehl printf ist der printf -Funktion aus der C-Sprache nachempfunden, es gibt jedoch Unterschiede. Wenn Sie C kennen, müssen Sie auf diese Unterschiede achten.

Grundlegende Zeichenketten schreiben

Sehen wir uns an, wie sich echo und printf unterscheiden, wenn sie Strings an das Terminal schreiben.

 Echo Hier sind einige Worte
 printf Hier sind einige Wörter 

Verwendung von echo und printf mit nicht zitierten Wörtern

Der Befehl echo gibt alle Wörter aus, aber printf nur das erste Wort aus. Außerdem gibt es keine neue Zeile, die von printf gedruckt wird. Die Ausgabe wird direkt an die Eingabeaufforderung angefügt. Aber das Wichtigste zuerst, damit printf auf alle Wörter einwirkt, müssen sie zitiert werden.

 Echo Hier sind einige Worte
 printf "hier sind ein paar Wörter" 

Verwendung von echo und printf mit Wörtern in Anführungszeichen

Das ist besser. Wir haben alle Wörter gedruckt, aber wir bekommen immer noch keine neue Zeile. Das liegt daran, dass Sie mit printf nur dann eine neue Zeile erhalten, wenn Sie danach fragen. Das mag wie ein Schmerz erscheinen, aber Sie können entscheiden, ob Sie einen einschließen möchten oder nicht. Damit printf eine neue Zeile ausgibt, müssen Sie „ \n “ in Ihren String einfügen. Dies ist die „newline“-Escape-Sequenz.

 Echo Hier sind einige Worte
 printf "hier sind ein paar Wörter\n" 

Verwenden von echo und printf mit Wörtern in Anführungszeichen und dem Zeilenumbruchzeichen

Manchmal verwenden Sie einen Zeilenumbruch und manchmal nicht. Hier ist ein Fall, in dem eine printf -Anweisung eine neue Zeile verwendet und die andere nicht.

 printf "How-To" && printf "Geek\n" 

Verwenden von zwei printfs zum Erstellen einer einzelnen Textzeile

Da das erste printf keine neue Zeile druckt, wird die Ausgabe des zweiten printf unmittelbar nach „How-To“ und in derselben Zeile positioniert. Der zweite printf verwendet \n , um eine neue Zeile zu drucken. Dadurch erscheint die Eingabeaufforderung in der Zeile unter dem gedruckten Text.

VERWANDT: So verarbeiten Sie eine Datei Zeile für Zeile in einem Linux-Bash-Skript

Andere Escape-Zeichen

Hier sind einige weitere Escape-Zeichen, die Sie verwenden können. Sie haben „ \n “ bereits in Aktion gesehen.

  • \n : Geht nach unten zu einer neuen Zeile.
  • \r : Druckt einen Wagenrücklauf. Dadurch wird der Ausgabecursor an den Anfang der aktuellen Zeile zurückgeschickt.
  • \t : Druckt ein Tabulatorzeichen.
  • \v : druckt einen vertikalen Tabstopp.
  • \\ : Druckt einen umgekehrten Schrägstrich.
  • \” : Druckt ein Anführungszeichen.
  • \b : Druckt ein Backspace-Zeichen.

Das Carriage-Return-Escape-Zeichen bewegt den Cursor zurück zum Anfang der aktuellen Zeile.

 printf "Honig ist die Wurzel allen Übels\rGeld\n" 

Verwenden des Wagenrücklaufzeichens, um zum Anfang der Zeile zurückzukehren

Der printf -Befehl verarbeitet seine Eingabe von links nach rechts. Die Zeichenfolge wird als normaler Text ausgegeben, bis printf auf das Escape-Zeichen „ \r “ trifft. Der Ausgabecursor wird an den Anfang der aktuellen Zeile zurückbewegt.

Die Verarbeitung der Zeichenfolge wird mit dem Buchstaben unmittelbar hinter dem Zeichen „ \r “ fortgesetzt. Die Verarbeitung des Rests veranlasst printf , „Money“ auszugeben und das Wort „Honey“ zu überschreiben.

Das Anführungszeichen „ " “ wird verwendet, um Zeichenfolgen in Anführungszeichen zu setzen, und der Backslash „ \ “ kennzeichnet Escape-Sequenzen. Wenn Sie diese Zeichen drucken möchten, müssen Sie sie mit einem Backslash maskieren. Dies weist printf an, sie als Literalzeichen zu behandeln.

 printf "Dies ist ein \tTab, dies ist ein Anführungszeichen \", und dies \\ ist ein Backslash\n" 

Escape-Zeichen, damit sie wörtlich behandelt werden

Verwenden von Variablen

Die Verwendung von Variablen mit printf ist der Verwendung mit echo sehr ähnlich. Um eine Variable wie diese Umgebungsvariable einzuschließen, stellen Sie ihr wie üblich das Dollarzeichen „ $ “ voran.

 printf "Home-Verzeichnis: $HOME\n" 

Verwendung von printf mit einer Umgebungsvariablen

VERWANDT: So arbeiten Sie mit Variablen in Bash

Zeichenfolgen formatieren

Formatstrings sind Strings, die das Format der Ausgabe definieren. Sie geben Text und andere Werte als Argumente für die zu bearbeitende Formatzeichenfolge an.

Die Formatzeichenfolge kann Text, Escape-Sequenzen und Formatbezeichner enthalten. Formatbezeichner teilen printf mit, welche Art von Argument zu erwarten ist, z. B. Zeichenfolgen, Ganzzahlen oder Zeichen.

Dies sind die gebräuchlichsten Formatbezeichner. Allen vorangestellt ist ein Prozentzeichen „ % “. Um ein Prozentzeichen zu drucken, verwenden Sie zwei Prozentzeichen zusammen „ %% “.

  • %s : Druckt eine Zeichenfolge.
  • %c : Druckt ein einzelnes Zeichen.
  • %d : Gibt eine Ganzzahl aus.
  • %f : gibt eine Fließkommazahl aus.
  • %u : Gibt eine Ganzzahl ohne Vorzeichen aus.
  • %o : Druckt einen Wert in Oktal.
  • %x : Gibt einen hexadezimalen Wert in Kleinbuchstaben aus.
  • %X : Gibt einen Wert hexadezimal in Großbuchstaben aus.
  • %e : Gibt eine Fließkommazahl in wissenschaftlicher Schreibweise in Kleinbuchstaben aus.
  • %E : Gibt eine Fließkommazahl in wissenschaftlicher Schreibweise in Großbuchstaben aus.
  • %% : Druckt ein Prozentsymbol „%“.
 printf "Anleitung %s\n" "Geek"
 printf "%s%s %s\n" "Wie" "-An" "Geek" 

Zeigen, dass printf "zu viele" Argumente akzeptiert

Die Formatzeichenfolge im ersten Befehl enthält eigenen Text. Wir übergeben den String „Geek“ als Argument an printf . Es wird mit dem Formatbezeichner „ %s “ abgeglichen und von ihm gedruckt. Beachten Sie, dass zwischen der Formatzeichenfolge und der Argumentzeichenfolge nur ein Leerzeichen steht. In C bräuchten Sie ein Komma, um sie zu trennen, aber mit der Bash-Version von printf reicht ein Leerzeichen aus.

Die zweite Formatzeichenfolge enthält nur Formatbezeichner und die Newline-Escape-Sequenz. Die drei String-Argumente werden der Reihe nach von jedem der „ %s “-Formatbezeichner verbraucht. Auch hier müssen Sie in C ein Komma zwischen jedes Argument setzen, aber der Bash printf lässt uns das vergessen.

Um verschiedene Arten von Argumenten auszugeben, verwenden Sie einfach den entsprechenden Formatbezeichner. Hier ist eine schnelle Nummernkonvertierungsroutine, die mit printf wurde. Wir geben den Wert 15 in Dezimal-, Oktal- und Hexadezimalschreibweise aus.

 printf "Dez: %d\nOkt: %o\nHex: %x\n" 15 15 15 

Verwenden von printf zum Drucken von numerischen Werten in verschiedenen Basisnotationen

Lassen Sie uns das etwas zurückschneiden, damit das Beispiel weniger überladen ist.

 printf "Hex: %x\n" 15 

Drucken eines Hexadezimalwerts

Die meisten von uns sind daran gewöhnt, Hexadezimalwerte in Großbuchstaben und mit Werten kleiner als 0x10 mit einer führenden Null gedruckt zu sehen. Wir können dies erreichen, indem wir den hexadezimalen Formatbezeichner „ %X “ in Großbuchstaben verwenden und einen Breitenbezeichner zwischen dem Prozentzeichen „ % “ und dem Zeichen „ X “ einfügen.

Dies teilt printf die Breite des Feldes mit, in dem das Argument gedruckt werden soll. Das Feld wird mit Leerzeichen aufgefüllt. Bei diesem Format würden zweistellige Werte ohne Auffüllung gedruckt.

 printf "Hex: %2X\n" 15 

Drucken eines Hexadezimalwerts in Großbuchstaben in einem Feld mit einer Breite von 2 Zeichen

Wir erhalten jetzt einen Großbuchstabenwert, der mit einem führenden Leerzeichen gedruckt wird. Wir können printf dazu bringen, das Feld mit Nullen anstelle von Leerzeichen aufzufüllen, indem wir eine Null vor die beiden setzen:

 printf "Hex: %02X\n" 15 

Drucken eines Hexadezimalwerts in Großbuchstaben in einem Feld mit einer Breite von 2 Zeichen, das mit Nullen aufgefüllt ist

Mit dem Genauigkeitsbezeichner können Sie die Anzahl der Dezimalstellen festlegen, die in der Ausgabe enthalten sein sollen.

 printf "Gleitkomma: %08.3f\n" 9.243546 

Verwenden von Breiten- und Genauigkeitsmodifikatoren mit einer Gleitkommazahl

Dies erleichtert die Erstellung von Ergebnistabellen mit sauber ausgerichteter Ausgabe. Dieser nächste Befehl demonstriert auch eine weitere Macke von Bash printf . Wenn mehr Argumente als Formatbezeichner vorhanden sind, werden die Argumente stapelweise in den Formatstring eingefügt, bis alle Argumente aufgebraucht sind. Die Größe des Stapels, der gleichzeitig verarbeitet wird, ist die Anzahl der Formatbezeichner in der Formatzeichenfolge. In C werden zusätzliche Argumente in printf Funktionsaufrufen ignoriert.

 printf "Float: %8.3f\n" 9,243546 23,665 8,0021 

Breiten- und Präzisionsmodifikatoren verwenden, um eine ordentliche Tabelle zu erstellen

Sie können die Breiten- und Genauigkeitsbezeichner auch mit Zeichenfolgen verwenden. Dieser Befehl gibt die Zeichenfolgen in einem 10 Zeichen breiten Feld aus.

 printf "%10s %d\n" "Mäntel" 7 "Schuhe" 22 "Regenschirme" 3 

Verwenden des Breitenmodifikators mit Zeichenfolgen

Standardmäßig werden Werte in ihren Feldern rechtsbündig ausgerichtet. Um sie linksbündig auszurichten, verwenden Sie direkt hinter dem Prozentzeichen „ % “ ein Minuszeichen „ - “.

 printf "%-10s %d" "Mäntel" 7 "Schuhe" 22 "Regenschirme" 3 

Verwenden eines linksbündigen Breitenbezeichners mit Zeichenfolgen

Der Genauigkeitsbezeichner kann verwendet werden, um die maximale Anzahl von Zeichen festzulegen, die gedruckt werden. Wir verwenden die Doppelpunktzeichen „ : “, um die Grenzen des Breitenfelds anzuzeigen. Nicht, wie das Wort „Umbrellas“ abgeschnitten wird.

 printf ":%10.6s:\n" "Mäntel" "Schuhe" "Regenschirme"
 printf ":%-10.6s:\n" "Mäntel" "Schuhe" "Regenschirme" 

Verwenden des Genauigkeitsmodifikators, um die Anzahl der Zeichen zu begrenzen, die von einer Zeichenfolge gedruckt werden

Der Breitenbezeichner kann sogar als Argument übergeben werden. Verwenden Sie ein Sternchen „ * “ anstelle eines numerischen Bezeichners und übergeben Sie die Breite als ganzzahliges Argument.

 printf "%*s\n" 20 "ganz rechts" 12 "Mitte" 5 "ganz links" 

Übergabe des Breitenbezeichners als Argument an printf

Andere Tricks und Macken

Die Formatbezeichner innerhalb der Formatzeichenfolge funktionieren mit Werten des entsprechenden Typs, unabhängig davon, ob sie in der Befehlszeile als reguläre Argumente bereitgestellt oder als Ausgabe eines Ausdrucks generiert werden.

Dies gibt die Summe zweier Zahlen aus:

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

Drucken der Summe zweier Zahlen

Dieser Befehl gibt die Anzahl der Verzeichnisse im aktuellen Arbeitsverzeichnis aus:

 printf "Es gibt %d Verzeichnisse\n" $(ls -d */ | wc -l) 

Verzeichnisse mit printf zählen

Dieser printf -Befehl druckt eine Zeichenfolge, die von einem Aufruf eines anderen Befehls zurückgegeben wird.

 printf "Aktueller Benutzer: %s\n" $(whoami) 

Drucken der Ausgabe eines anderen Befehls

Wenn ein String-Formatbezeichner „ %s “ nicht mit einem Argument geliefert wird, gibt printf nichts aus.

 printf "Eins: %s zwei: %s\n" "Alpha" 

Wie printf mit fehlenden String-Argumenten umgeht

Wenn ein Zeichenfolgenformatbezeichner „ %s “ versehentlich mit einem numerischen Wert versehen wird, gibt er ihn aus, als wäre er eine Zeichenfolge, und beschwert sich nicht. Versuchen Sie das nicht mit dem C printf – es werden sehr schlimme Dinge passieren. Ihr Programm wird wahrscheinlich abstürzen. Aber die Bash printf kommt damit klaglos zurecht.

 printf "Eins: %s zwei: %s\n" "Alpha" 777 

Wie printf Ganzzahlen stillschweigend als Zeichenfolgenwerte akzeptiert

Wenn ein ganzzahliger Formatbezeichner „ %d “ kein Argument erhält, gibt er Null aus.

 printf "Ganzzahl: %d\n" 

Wie printf mit fehlenden Integer-Argumenten umgeht

Wenn ein ganzzahliger Formatbezeichner „ %d “ versehentlich ein String-Argument erhält, gibt Bash eine Fehlermeldung aus und printf gibt Null aus.

 printf "Ganzzahl: %d\n" "Sieben" 

Wie printf Strings behandelt, die anstelle von Integer-Argumenten bereitgestellt werden

Umständliche Symbole können mithilfe ihrer Unicode-Nummer oder ihres „Codepunkts“ generiert werden. Diese werden mit dem Buchstaben „u“ gefolgt von ihrem Unicode-Wert maskiert.

 printf "Das Euro-Symbol: \u20AC\n" 

Drucken eines maskierten Unicode-Werts

Um Escape-Sequenzen in Argumentzeichenfolgen einzufügen, müssen Sie den Formatbezeichner „ %b “ in der Formatzeichenfolge verwenden, nicht den Formatbezeichner „ %s “.

 printf "%s" "\u20AC\n"
 printf "%b" "\u20AC\n" 

Verwendung des %b-Formatbezeichners zur Handhabung von Escape-Sequenzen in String-Argumenten

Die erste printf -Anweisung verarbeitet den Unicode-Wert nicht und erkennt die Newline-Escape-Sequenz nicht. Die zweite printf -Anweisung verwendet den Formatbezeichner „ %b “. Das verarbeitet das Unicode-Zeichen korrekt und eine neue Zeile wird gedruckt.

VERWANDT: Was sind Zeichencodierungen wie ANSI und Unicode und wie unterscheiden sie sich?

Pferde für Kurse

Manchmal müssen Sie echo einen Text in das Terminalfenster zurückgeben. Aber wenn Sie etwas Positionierung und Formatierung anwenden müssen, ist printf das richtige Werkzeug für den Job.

 printf "%b" "Tha-" "tha-" "tha-" "das ist alles Leute.\n"