Der printf-Befehl Stranger, das ist ein sehr großes Thema, das Erfahrung braucht - bitte fehlende Informationen ausfüllen, die Beschreibungen erweitern und die Details korrigieren, wenn du Achtung hast: Dies ist der Bash-builtin-Befehl printf - allerdings sollte die Beschreibung sein Fast identisch für einen externen Befehl, der POSIX folgt. GNU Awk erwartet ein Komma nach dem Formatstring und zwischen jedem der Argumente eines printf-Befehls. Beispiele finden Sie unter: Code-Snippet. Im Gegensatz zu anderen Dokumentationen möchte ich Sie nicht zur manuellen Seite für die printf () C-Funktionsfamilie umleiten. Allerdings, wenn you039re mehr erfahren, das sollte die detaillierteste Beschreibung für die Format-Strings und Modifikatoren sein. Aufgrund widersprüchlicher historischer Implementierungen des Echo-Befehls empfiehlt POSIX, dass printf über Echo bevorzugt wird. Der Befehl printf bietet eine Methode zum Drucken von vorformatierten Texten ähnlich der printf () Systemschnittstelle (C-Funktion). It039s meinte als Nachfolger für Echo und hat weit mehr Features und Möglichkeiten. Neben anderen Gründen hat POSIX ein sehr gutes Argument, es zu empfehlen: Beide historischen Hauptaromen des Echokommandos sind gegenseitig exklusiv, sie kollidieren. Ein Quellbefehl musste erfunden werden, um das Problem zu lösen. Das Textformat ist in ltFORMATgt angegeben. Während alle Argumente, auf die der Formatstring hindeuten kann, nachher gegeben werden, hier, angeführt durch ltARGUMENTSgt. So sieht ein typischer printf - call folgendermaßen aus: wo nameSname: snName: snquot ist die formatangabe und die beiden Variablen werden als argumente übergeben, die s im formatstring zeigt an (für jeden format spezifizierer gibt es printf auf ein argument) . Wenn gegeben, wird die Ausgabe der Variablen VAR zugewiesen, anstatt in stdout gedruckt zu werden (vergleichbar mit sprintf () in irgendeiner Weise) Die Option - v Option kann direkt in Array-Indizes in Bash-Versionen älter als Bash 4.1 zuweisen. In Versionen, die jünger als 4.1 sind, muss man bei der Ausführung von Erweiterungen in das erste Nicht-Option-Argument von printf vorsichtig sein, da dies die Möglichkeit einer einfachen Code-Injection-Schwachstelle eröffnet. Wo das Echo natürlich mit jedem beliebigen Befehl ersetzt werden kann. Wenn Sie müssen, geben Sie entweder einen hartcodierten Formatstring an oder verwenden Sie - um das Ende der Optionen zu signalisieren. Das genaue gleiche gilt auch für gelesen. Und ein ähnliches zu mapfile. Obwohl die Ausführung von Erweiterungen in ihre Argumente ist weniger häufig. Natürlich in der Shell-Bedeutung der Argumente sind nur Strings, aber die gemeinsamen C-Notationen plus einige Ergänzungen für Anzahl-Konstanten sind anerkannt, um ein Zahlen-Argument zu printf. Basically, seine eine Portabilität (und Zuverlässigkeit) Problem geben. Zuerst akzeptierte das Echo keine Option und erweitert nichts. Alles, was es tat, war die Ausgabe seiner Argumente durch ein Leerzeichen Zeichen und beendet durch ein Zeilenumbruch Zeichen. Nun, jemand dachte, es wäre schön, wenn wir Dinge tun könnten, wie Echo nt, um Zeilenumbrüche oder Tab-Zeichen auszugeben, oder haben Sie eine Option, um nicht das nachlaufende Zeilenumbruchzeichen auszugeben. Sie dachten dann härter, aber anstatt diese Funktionalität der Schale hinzuzufügen (wie perl, wo in doppelte Zitate, t eigentlich bedeutet ein Tab-Zeichen), fügten sie es zu Echo. David Korn erkannte den Fehler und stellte eine neue Form von Muscheln vor:. Die später von bash und zsh kopiert wurde, aber es war viel zu spät zu diesem Zeitpunkt. Jetzt, wenn ein Standard-Unix-Echo ein Argument erhält, das die beiden Zeichen und t enthält. Anstatt sie auszugeben, gibt sie ein Tabulatorzeichen aus. Und sobald es c in einem Argument sieht, stoppt es die Ausgabe (so dass die nachlaufende Zeilenumbruch auch nicht ausgegeben wird). Andere ShellsUnix Vendorsversions entschieden sich, es anders zu machen: Sie haben eine Option - e hinzugefügt, um Escape-Sequenzen zu erweitern, und eine Option - n, um das nachgestellte Newline nicht auszugeben. Einige haben eine - E, um Escape-Sequenzen zu deaktivieren, einige haben - n aber nicht - e. Die Liste der Escape-Sequenzen, die von einer Echo-Implementierung unterstützt werden, ist nicht notwendigerweise dieselbe wie die von einem anderen unterstützt wird. Auf diesen Echo-Implementierungen, die Optionen unterstützen, gibt es in der Regel keine Unterstützung von a - um das Ende der Optionen zu markieren (zsh und evtl. andere unterstützen - dafür), so zum Beispiel, seine schwierig zu vergeben - n mit Echo in vielen Shells. Bei einigen Shells wie bash 1 oder ksh93 2 oder yash (ECHOSTYLE Variable) hängt das Verhalten sogar davon ab, wie die Shell kompiliert wurde oder die Umgebung (das Verhalten von GNU echo ändert sich auch, wenn POSIXLYCORRECT in der Umgebung ist). Also zwei Bash-Echos, auch aus der gleichen Version von bash sind nicht garantiert, um das gleiche zu verhalten. POSIX sagt: Wenn das erste Argument - n oder irgendein Argument Backslashs enthält, dann ist das Verhalten nicht spezifiziert. Bash Echo in dieser Hinsicht ist nicht POSIX in, dass zum Beispiel Echo - e ist nicht ausgegeben - eltnewlinegt wie POSIX erfordert. Die Unix-Spezifikation ist strenger, sie verbietet - n und erfordert die Erweiterung einiger Escape-Sequenzen, einschließlich der c, um die Ausgabe zu stoppen. Diese Spezifikationen kommen nicht wirklich zur Rettung hier, da viele Implementierungen nicht konform sind. Alles in allem wissen Sie nicht, was Echo Var ausgeben wird, es sei denn, Sie können sicherstellen, dass var keine Backslash-Zeichen enthält und nicht mit -. Die POSIX-Spezifikation sagt uns eigentlich, dass wir in diesem Fall printf verwenden. Also, was das bedeutet, ist, dass man Echo nicht verwenden kann, um unkontrollierte Daten anzuzeigen. Mit anderen Worten, wenn Sie ein Skript schreiben und es wird externe Eingabe (aus dem Benutzer als Argumente oder Dateinamen aus dem Dateisystem). Sie können nicht verwenden Echo, um es anzuzeigen. (Obwohl es mit einigen (Nicht-Unix) Echo-Implementierungen wie bash s funktioniert, wenn die Option xpgecho nicht in der einen oder anderen Weise wie zum Zeitpunkt der Kompilierung oder über die Umgebung aktiviert wurde). Printf. Auf der anderen Seite ist zuverlässiger, zumindest wenn es auf die grundlegende Verwendung von Echo beschränkt ist. Wird den Inhalt von var gefolgt von einem Zeilenumbruch Zeichen unabhängig davon, welche Zeichen es enthalten kann. Wird es ohne den nachlaufenden Zeilenumbruch ausgeben. Nun gibt es auch Unterschiede zwischen printf-Implementierungen. Theres ein Kern der Features, die von POSIX angegeben ist, aber dann gibt es viele Erweiterungen. Zum Beispiel, einige unterstützen ein q, um die Argumente zu zitieren, aber wie seine getan variiert von Shell zu Shell, einige Unterstützung uxxxx für Unicode-Zeichen. Das Verhalten variiert für printf 10sn var in Multi-Byte-Locales, es gibt mindestens drei verschiedene Ergebnisse für printf b 123 Aber am Ende, wenn Sie sich an die POSIX-Feature-Set von printf und nicht versuchen, etwas zu fancy mit ihm, youre aus der Patsche. Aber denken Sie daran, das erste Argument ist das Format, so sollte nicht enthalten variablecontrolled Daten. Ein zuverlässigeres Echo kann mit printf implementiert werden. Wie: Die Subhell (was bedeutet, dass ein Extraprozess in den meisten Shell-Implementierungen hervorgebracht wird) kann mit lokalem IFS mit vielen Shells vermieden werden, oder indem man es wie folgt schreibt: 1. Wie kann man das Echo-Verhalten verändern. Mit bash Zur Laufzeit gibt es zwei Dinge, die das Verhalten oder das Echo steuern (neben enable - n Echo oder Neudefinition von Echo als Funktion oder Alias): die Option xpgecho bash und ob bash im posix-Modus ist. Posix-Modus kann aktiviert werden, wenn bash als sh oder wenn POSIXLYCORRECT in der Umgebung oder mit der Option posix aufgerufen wird: Standardverhalten bei den meisten Systemen: xpgecho erweitert Sequenzen als Unix erfordert: Es ehrt immer - n und - e (und - E ): Mit xpgecho und POSIX-Modus: Diesmal ist bash sowohl POSIX als auch Unix-konform. Beachten Sie, dass im POSIX-Modus bash immer noch nicht POSIX konform ist, da es nicht ausgegeben wird - e in: Die Standardwerte für xpgecho und posix können zur Kompilierungszeit mit dem --enable-xpg-echo-default und --enable-strict definiert werden - posix-default-Optionen zum configure-Skript. Das ist in der Regel, was neue Versionen von OSX tun, um ihre Binsh zu bauen. Keine UnixLinux Implementierungsverteilung in ihrem richtigen Verstand würde das normalerweise für binbash tun. 2. Wie das Verhalten des KH93-Echo verändert werden kann. In ksh93 Ob Echo Flucht-Sequenzen erweitert oder nicht und erkennt Optionen hängt vom Inhalt von PATH ab. Wenn PATH eine Komponente enthält, die 5bin oder xpg vor der Bin - oder Usbbin-Komponente enthält, dann verhält sie sich die SysVUnix-Weise (erweitert Sequenzen, akzeptiert keine Optionen). Wenn es zuerst ubb oder bsd findet, dann verhält es sich der BSD 3-Weg (-e, um die Erweiterung zu aktivieren, erkennt - n). Die Voreinstellung ist systemabhängig, BSD auf Debian: 3. BSD für echo - e Der Hinweis auf BSD für die Handhabung der Option - e ist hier irreführend. Alle diese verschiedenen und unvereinbaren Echo-Verhaltensweisen wurden alle bei Bell Labs eingeführt: n. 0ooo in Programmierer Arbeitstisch UNIX (basierend auf Unix V6) und der Rest (b. C.) In Unix System III Ref. - n in Unix V7 (von Denis Ritchie Ref) - e in Unix V8 (von Denis Ritchie Ref) BSDs stieg nur von Unix V7 ab. FreeBSD Echo unterstützt noch nicht - e. Obwohl es unterstützt - n wie Unix V7 tat. Ein Vorteil, wenn du es so nennen willst, wäre das, dass du es nicht wie Echo erzählen musst, um bestimmte Escape-Sequenzen wie n zu interpretieren. Sie weiß es, sie zu interpretieren und wird nicht dazu verpflichtet, das zu tun. (NB: das letzte n ist notwendig, Echo impliziert es, es sei denn, du gibst die Option - n) Notiz das letzte n in printf. Am Ende des Tages ist es eine Frage des Geschmacks und der Anforderungen, was Sie verwenden: echo oder printf. Ein Nachteil von printf ist Leistung, weil das eingebaute Shell-Echo viel schneller ist. Dies kommt ins Spiel vor allem in Cygwin, wo jede Instanz eines neuen Befehls verursacht schwere Windows Overhead. Als ich mein echo-schweres Programm von der Verwendung von Binecho zu den Muscheln änderte, veränderte sich die Leistung fast. Es ist ein Kompromiss zwischen Portabilität und Leistung. Es ist kein Slam dunk, um immer printf zu benutzen. Beantwortet Okt 3 14 bei 17: 00Linux und Unix printf Befehl Die FORMAT String enthält drei Arten von Objekten: normale Zeichen. Die wörtlich zur Ausgabe kopiert werden. Interpretierte Zeichenfolgen, die mit einem Backslash () entkommen sind. Umwandlungsspezifikationen, die die Art und Weise definieren, in der ARGUMENT s als Teil der Ausgabe ausgedrückt wird. Hier ist ein schnelles Beispiel, das diese drei Arten von Objekten verwendet: Dieser Befehl erzeugt die Ausgabe: Hier ist FORMAT in doppelte Anführungszeichen () eingeschlossen. Es gibt eine Umwandlungsspezifikation: s. Die das Argument John als String interpretiert und in die Ausgabe einfügt. Es gibt drei entweichte Zeichenfolgen: zwei Vorkommen und ein Vorkommen von n. Die Sequenz übersetzt als buchstäbliches Doppelzitat, es ist mit einem Backslash entkommen, so dass printf es kennt, um es als wörtlichen Charakter zu behandeln und nicht als das Ende der FORMAT-Saite. N ist die Sequenz für ein Zeilenumbruchzeichen und teilt printf mit, eine neue Zeile zu beginnen und die Ausgabe von dort fortzusetzen. Die Kraft von printf liegt in der Tatsache, dass für jede gegebene FORMAT-Zeichenfolge das ARGUMENT s geändert werden kann, um die Ausgabe zu beeinflussen. Zum Beispiel kann die Ausgabe des Befehls in dem obigen Beispiel nur durch Ändern des Arguments geändert werden. Wenn in einem Skript verwendet. Dieses Argument kann auf eine Variable gesetzt werden. Zum Beispiel fügt der Befehl den Wert der Umgebungsvariablen LOGNAME ein. Das ist der Benutzername desjenigen, der den Befehl geführt hat. Umwandlungsspezifikationen Jede Umwandlungsvorschrift beginnt mit einem und endet mit einem Umwandlungszeichen. Zwischen dem und dem Umwandlungszeichen kann es sein, in Ordnung: ein Minuszeichen. Dies sagt, dass printf links die Anpassung der Konvertierung des Arguments anpasst. Eine Ganzzahl, die die Feldbreite printf spezifiziert, druckt eine Umwandlung von ARGUMENT in ein Feld mit mindestens zahlreichen Zeichen. Bei Bedarf wird es links gepolstert (oder rechts, wenn die linke Einstellung gefordert wird), um die Feldbreite zu bilden. Eine Periode, die die Feldbreite von der Präzision trennt. Eine Ganzzahl, die Präzision, die die maximale Anzahl der zu druckenden Zeichen aus einer Zeichenkette oder die Anzahl der Ziffern nach dem Dezimalpunkt eines Gleitkommawertes oder die minimale Anzahl von Ziffern für eine Ganzzahl angibt. Diese unterscheiden zwischen einer kurzen und einer langen ganzen Zahl und werden in der Regel nur für die Computerprogrammierung benötigt. Die Umwandlungszeichen selbst, die sagen, printf, welche Art von Argument zu erwarten, sind wie folgt: Bitte beachten Sie, dass printf die Anzahl der Conversion-Strings benötigt, um die Anzahl der ARGUMENTs zu entsprechen, die sie sie einzeln abbilden, und erwartet genau zu finden Ein ARGUMENT für jede Umwandlungszeichenfolge. Die einzige Ausnahme ist eine Umwandlungszeichenfolge, die ein Sternchen verwendet, wobei solche Zeichenfolgen jeweils zwei Argumente erfordern. Conversion-Strings werden immer von links nach rechts interpretiert. Beispielsweise erzeugt der folgende printf-Befehl: folgende Ausgabe: Interpretierte Escaped Character Sequenzen Die folgenden Zeichenfolgen werden als Sonderzeichen von printf interpretiert: druckt ein double-quote () druckt einen Backslash () gibt eine Warnung aus (spielt eine Glocke) Ein Backspace weist printf an, um keine weiteren Ausgabedrucke zu erzeugen, ein Escape-Zeichen (ASCII-Code 27) druckt eine horizontale Registerkarte druckt eine vertikale Registerkarte druckt ein Byte mit Oktalwert NNN (1 bis 3 Ziffern) druckt ein Byte mit Hexadezimalwert HH (1 bis 2 Ziffern) druckt das Unicode-Zeichen mit Hexadezimalwert HHHH (4 Ziffern) druckt das Unicode-Zeichen mit hexadezimalem Wert HHHHHHHH (8-stellig) druckt ARGUMENT als String mit Escapes, die wie oben aufgeführt interpretiert werden, mit der Ausnahme, dass oktale Escapes das Formular 0 oder 0 haben NN Zitat in der Schale Sei vorsichtig mit der Art, wie deine Schale zitierte Strings interpretiert. Wenn Ihre Shell nicht korrekt Ihre zitierte Zeichenfolge interpretiert, versuchen Sie es mit Single-Quotes und nicht als doppelte Anführungszeichen. Printf Beispiele Druckt die folgende Ausgabe: Druckt die gleiche Ausgabe wie das obige Beispiel. Druckt einen String, der Ihnen den Standort Ihres Home-Verzeichnisses mitteilt. Verwandte Befehle awk mdash Dolmetscher für die AWK Textverarbeitungsprogrammiersprache. Bc mdash Ein Rechner. Echo mdash Ausgabetext.
No comments:
Post a Comment