Shell printf-Befehl
Im vorherigen Kapitel haben wir den Shell-Befehl echo kennengelernt. In diesem Kapitel lernen wir einen weiteren Shell-Ausgabebefehl kennen: printf.
printf(print formatted) ist ein Shell-Befehl für formatierte Ausgabe, abgeleitet von der C-Spracheprintf()Funktion.
undechoIm Gegensatz zu,printfEs fügt nicht automatisch Zeilenumbrüche hinzu und kann das Ausgabeformat präzise steuern.
printf ist durch den POSIX-Standard definiert, daher sind Skripte, die printf verwenden, portabler als solche, die echo verwenden.
printf verwendet in Anführungszeichen gesetzten Text oder durch Leerzeichen getrennte Argumente, und Sie könnenprintfFormatzeichenfolgen darin verwenden und auch Zeichenkettenbreite, links/rechts Ausrichtung usw. angeben. Standardmäßig fügt printf nicht,echoautomatisch Zeilenumbrüche hinzu; wir können sie manuell hinzufügen.\n。
Warum printf verwenden?
- Formatsteuerung: Kann Feldbreite, Genauigkeit und Ausrichtung angeben.
- Typsicherheit: Verschiedene Datentypen (Ganzzahlen, Gleitkommazahlen, Zeichenketten usw.) haben entsprechende Formatbezeichner.
- Portabilität: Das Verhalten ist konsistenter über verschiedene Systeme und Shells hinweg.
- Komplexe Ausgabe: Geeignet für die Erzeugung strukturierter Ausgaben wie Tabellen und Berichte.
Grundlegende Syntax
Die Syntax des Befehls printf:
printf format-string [arguments...]
Parameter description:
- format-string: Eine Zeichenkette, die gewöhnliche Zeichen und Formatbezeichner enthält.
- arguments...: Variablen oder Werte, die den Formatbezeichnern entsprechen.
Formatbezeichner beginnen mit einem%Zeichen, gefolgt von einem oder mehreren Zeichen, mit denen das Ausgabeformat festgelegt wird. Zu den gebräuchlichen Formatbezeichnern gehören:
%s: Zeichenkette%d: Dezimalzahl%f: Gleitkommazahl%c: Zeichen%x: Hexadezimalzahl%o: Oktalzahl%b: Binärzahl%e: Gleitkommazahl in wissenschaftlicher Notation
Workflow
- Den Format-String parsen; normale Zeichen direkt ausgeben, wenn sie auftreten.
- Wenn ein Formatbezeichner (beginnend mit
%am Anfang) angetroffen wird:- Das nächste Argument lesen.
- Das Argument gemäß dem durch den Bezeichner angegebenen Format verarbeiten.
- Das Ergebnis in die Ausgabe einfügen.
- Nach der Verarbeitung aller Formatbezeichner das endgültige Ergebnis ausgeben.
Praktische Beispiele
1. Grundlegende Verwendung
Beispiel
printf "Hello, World!\n"
# Ausgabe mit Variablen
name="Alice"
printf "Hello, %s\n" "$name"
Ausführung und Ausgabe:
Beispiel
Hallo, Welt!
Hallo, Alice
2. Häufige Formatbezeichner
Beispiel
printf "Dezimal: %d\nHex: %x\nOktal: %o\n" 255 255 255
# Gleitkommazahl
printf "Gleitkommazahl: %f\nWissenschaftlich: %e\n" 3.14159 3.14159
# Zeichenkette
printf "Name: %s\n" "Bob"
# Zeichen
printf "Erster Buchstabe: %c\n" "A"
Ausführungsergebnis:
Decimal: 255 Hex: ff Octal: 377 Float: 3.141590 Scientific: 3.141590e+00 Name: Bob First letter: A
3. Formatierungssteuerung
Beispiel
printf "|%10s|\n|%-10s|\n" "right" "left"
# Führende Nullen in Zahlen
printf "Year: %04d\n" 23
# Gleitkommapräzision
printf "Pi: %.2f\n" 3.14159
Ausführungsergebnis:
| right| |left | Year: 0023 Pi: 3.14
4. Umgang mit mehreren Argumenten
Beispiel
Ausführungsergebnis:
Apple 5 2.50 Orange 3 1.75
Erweiterte Anwendungen
1. Erstellen einer Tabellenausgabe
Beispiel
# Kopfzeile
printf "%-15s %10s %10s %10s\n" "Artikel" "Menge" "Preis" "Gesamt"
# Trennlinie
printf "%-15s %10s %10s %10s\n" "---------------" "----------" "----------" "----------"
# Datenzeilen
printf "%-15s %10d %10.2f %10.2f\n" "Notizbuch" 3 2.50 7.50
printf "%-15s %10d %10.2f %10.2f\n" "Stift" 5 1.20 6.00
printf "%-15s %10d %10.2f %10.2f\n" "Radiergummi" 2 0.50 1.00
# Gesamtzeile
printf "%-15s %10s %10s %10.2f\n" "" "" "Gesamt:" 14.50
Ausgabeeffekt:
Item Quantity Price Total
--------------- ---------- ---------- ----------
Notebook 3 2.50 7.50
Pen 5 1.20 6.00
Eraser 2 0.50 1.00
Total: 14.50
2. Implementierung der Fortschrittsanzeige
Beispiel
for i in {1..20}; do
printf "\rFortschritt: [%-20s] %d%%" $(printf "%${i}s" | tr ' ' '#') $((i*5))
sleep 0.1
done
printf "\n"
Ausführungseffekt: Zeigt einen allmählich wachsenden Fortschrittsbalken an.
3. Farbige Ausgabe
Beispiel
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # Keine Farbe
printf "${RED}Fehler:${NC} Etwas ist schiefgelaufen\n"
printf "${GREEN}Erfolg:${NC} Vorgang abgeschlossen\n"
4. Formatierte Ausgabe
Als Nächstes werde ich ein Skript verwenden, um die leistungsstarken Funktionen von printf zu demonstrieren:
Beispiel
# Autor: Beispiel
# url:www.example.com
printf "%-10s %-8s %-4s\n"Name Geschlecht Gewicht (kg)
printf "%-10s %-8s %-4.2f\n"Guo Jing Männlich66.1234
printf "%-10s %-8s %-4.2f\n"Yang Guo Männlich48.6543
printf "%-10s %-8s %-4.2f\n"Guo Fu Weiblich47.9876
Führen Sie das Skript aus, und die Ausgabe lautet wie folgt:
姓名 性别 体重kg 郭靖 男 66.12 杨过 男 48.65 郭芙 女 47.99
%s %c %d %fDies sind alles Formatbezeichner.%sGibt eine Zeichenkette aus,%dGanzzahlausgabe,%cgibt ein Zeichen aus,%fgibt eine reelle Zahl in Dezimalform aus.
%-10sBezieht sich auf eine Breite von 10 Zeichen (-Gibt die linke Ausrichtung an; ohne sie wird die rechte Ausrichtung verwendet. Alle Zeichen werden innerhalb einer Breite von 10 Zeichen angezeigt. Falls die Breite nicht ausreicht, wird automatisch mit Leerzeichen aufgefüllt; falls sie überschritten wird, wird der Inhalt trotzdem vollständig angezeigt.
%-4.2fBezieht sich auf die Formatierung als Dezimalzahl, wobei.2die Beibehaltung von 2 Dezimalstellen bedeutet.
Beispiel
# Autor: Beispiel
# url:www.example.com
# Format-String verwendet doppelte Anführungszeichen
printf "%d %s\n" 1 "abc"
# Einfache Anführungszeichen haben die gleiche Wirkung wie doppelte Anführungszeichen
printf '%d %s\n' 1 "abc"
# Die Ausgabe kann auch ohne Anführungszeichen erfolgen
printf %s abcdef
# Das Format legt nur ein Argument fest, aber die zusätzlichen Argumente werden trotzdem gemäß diesem Format ausgegeben; der Format-String wird wiederverwendet
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# Wenn keine Argumente vorhanden sind, wird %s durch NULL und %d durch 0 ersetzt
printf "%s und %d \n"
Führen Sie das Skript aus, und die Ausgabe lautet wie folgt:
1 abc 1 abc abcdefabcdefabc def a b c d e f g h i j and 0
printf-Escape-Sequenzen
| Sequenz | Beschreibung |
|---|---|
| \a | Alarmzeichen, normalerweise das ASCII-BEL-Zeichen. |
| \b | Rücktaste |
| \c | Unterdrückt (zeigt nicht an) ein abschließendes Zeilenumbruchzeichen im Ausgabeergebnis (nur gültig in Argumentzeichenketten, die durch den %b-Formatbezeichner gesteuert werden). Darüber hinaus werden alle im Argument verbleibenden Zeichen, alle nachfolgenden Argumente und alle in der Formatzeichenkette verbleibenden Zeichen ignoriert. |
| \f | Seitenvorschub |
| \n | Zeilenumbruch |
| \r | Wagenrücklauf |
| \t | Horizontaler Tabulator |
| \v | Vertikaltabulator |
| \\ | Ein literales Backslash-Zeichen |
| \ddd | Ein Zeichen, das einen 1- bis 3-stelligen Oktalwert darstellt. Nur in der Formatzeichenkette gültig. |
| \0ddd | Ein Zeichen, das einen 1- bis 3-stelligen Oktalwert darstellt. |
Beispiel
eine Zeichenkette, keine Verarbeitung:<A\nB>
$ printf "eine Zeichenkette, keine Verarbeitung:<%b>\n" "A\nB"
eine Zeichenkette, keine Verarbeitung:<A
B>
$ printf "www.example.com \a"
www.example.com $ # Kein Zeilenumbruch
Zusammenfassung der wichtigsten Punkte
Rückblick auf die wichtigsten Kenntnisse
| Konzept | Beschreibung | Beispiel |
|---|---|---|
| Grundlegende Syntax | printf "format" args |
printf "%s" "hello" |
| Formatbezeichner | Beginnt mit %, legt Datentyp und Format fest. | %d(integer),%f(Gleitkommazahl) |
| Escape-Zeichen | Darstellung von Sonderzeichen | \n(Zeilenumbruch),\t(Tabulator) |
| Feldbreite | Steuert die Mindestbreite der Ausgabe | %10s(10 Zeichen breit) |
| Präzisionskontrolle | Anzahl der Dezimalstellen für Gleitkommazahlen | %.2f(2 Dezimalstellen) |
Schnellreferenztabelle gängiger Formatbezeichner
| Formatbezeichner | Zweck | Beispieleingabe | Beispielausgabe |
|---|---|---|---|
%s |
String | "text" |
text |
%d |
Dezimal-Ganzzahl | 255 |
255 |
%x |
Hexadezimale Ganzzahl | 255 |
ff |
%f |
Gleitkommazahl | 3.14159 |
3.141590 |
%.2f |
2 Dezimalstellen | 3.14159 |
3.14 |
%c |
Einzelzeichen | "A" |
A |
%% |
Prozentzeichen | - | % |