So verwenden Sie den Bash-printf-Befehl unter Linux
Veröffentlicht: 2022-06-25 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.
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
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"
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"
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"
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"
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"
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"
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"
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
Lassen Sie uns das etwas zurückschneiden, damit das Beispiel weniger überladen ist.
printf "Hex: %x\n" 15
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
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
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
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
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
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
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"
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"
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))
Dieser Befehl gibt die Anzahl der Verzeichnisse im aktuellen Arbeitsverzeichnis aus:
printf "Es gibt %d Verzeichnisse\n" $(ls -d */ | wc -l)
Dieser printf
-Befehl druckt eine Zeichenfolge, die von einem Aufruf eines anderen Befehls zurückgegeben wird.
printf "Aktueller Benutzer: %s\n" $(whoami)
Wenn ein String-Formatbezeichner „ %s
“ nicht mit einem Argument geliefert wird, gibt printf
nichts aus.
printf "Eins: %s zwei: %s\n" "Alpha"
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
Wenn ein ganzzahliger Formatbezeichner „ %d
“ kein Argument erhält, gibt er Null aus.
printf "Ganzzahl: %d\n"
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"
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"
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"
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"