Ist echoobligatorisch? Sie können verwenden printf.
Archemar
Ich wusste nichts über printf, mit printf funktioniert es: P ... also, was bringt es, wenn nicht mit Echo gearbeitet wird?
Saeid Yazdani
Gehört \rInclude zur Ausgabe oder ist es Teil von CRLFNewline?
Donnerstag,
9
Es gibt viele verschiedene Implementierungen von echoBefehlen, die nicht miteinander kompatibel sind. Daher wird empfohlen, mehr Standardwerkzeug als zu verwenden printf. Unter unix.stackexchange.com/questions/65803/… finden Sie eine erweiterte Übersicht über das Problem.
Ein String, der in die Standardausgabe geschrieben werden soll. Ist der erste Operand -noder enthält einer der Operanden ein < \Backslash> -Zeichen, sind die Ergebnisse implementierungsdefiniert .
Auf XSI-konformen Systemen wird der erste Operand -nals Zeichenfolge und nicht als Option behandelt . Die folgenden Zeichenfolgen müssen auf XSI-konformen Systemen innerhalb eines der Argumente erkannt werden:
\a- Schreiben Sie einen <alert> .
\b- Schreiben Sie ein <Backspace> .
\c- Unterdrücken Sie die <newline> , die ansonsten auf das letzte Argument in der Ausgabe folgt. Alle Zeichen, die den \cin den Argumenten folgen , werden ignoriert.
\f- Schreiben Sie einen <Formular-Feed> .
\n- Schreiben Sie eine <newline> .
\r- Schreiben Sie einen <Wagenrücklauf> .
\t- Schreiben Sie ein <tab> .
\v- Schreiben Sie einen <Vertical-Tab> .
\\- Schreiben Sie ein <Backslash> -Zeichen.
\0num- Schreiben Sie einen 8-Bit-Wert, der die null-, ein-, zwei- oder dreistellige Oktalzahl ist num.
Und so gibt es wirklich keinen allgemeinen Weg, wie man eine neue Zeile schreibt echo, außer dass man sich im Allgemeinen darauf verlassen kann echo, dies einfach zu tun.
Eine bashShell entspricht normalerweise nicht der Spezifikation und behandelt die -nund andere Optionen, aber auch das ist ungewiss. Du kannst tun:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Und nicht einmal das ist notwendig, wenn bashmit der Build-Time-Option gebaut wurde ...
echoVeranlassen Sie das eingebaute Expandieren von Zeichen mit umgekehrten Schrägstrichen standardmäßig, ohne dass die -eOption erforderlich ist . Dies setzt den Standardwert der xpg_echoShell-Option auf on, wodurch sich die Bash echomehr wie die in der Single Unix Specification, Version 3, angegebene Version verhält . Eine Beschreibung der echoerkannten Escape-Sequenzen finden Sie unter Bash Builtins .
printf
Auf der anderen Seite ist printfdas Verhalten im Vergleich ziemlich zahm.
Das printfDienstprogramm wurde hinzugefügt, um Funktionen bereitzustellen, die in der Vergangenheit von bereitgestellt wurden echo. Aufgrund der unüberbrückbaren Unterschiede in den verschiedenen vorhandenen Versionen echoweist die Version jedoch nur wenige Besonderheiten auf, so dass diese diesem neuen printfDienstprogramm überlassen bleiben, das auf einem Dienstprogramm im neunten Editionssystem basiert.
Der Abschnitt EXTENDED DESCRIPTION (ERWEITERTE BESCHREIBUNG) entspricht fast genau der printf()Funktion im ISO-C-Standard, obwohl er in der Dateiformatnotation in der XBD-Dateiformatnotation beschrieben wird .
Es behandelt Format-Strings, die ihre Argumente beschreiben - das kann eine beliebige Anzahl von Dingen sein, aber für Strings sind es so ziemlich entweder %bYte-Strings oder Literal- %sTrings. Anders als die %fOrmats im ersten Argument verhält es sich am %bähnlichsten wie ein Yte-String-Argument, außer dass es das \cEscape nicht behandelt .
Eine nette einfache "-e" Option, um Escape-Sequenzen zum Laufen zu bringen - es steht auf einer anderen Antwort, echodie unzuverlässig ist und im Gegensatz zu anderen Standards nicht den Standards folgt printf.
Edward
1
Stellen Sie sicher, dass Ihr Skript kein Literal enthält, z. B. in einem tr -d "\n"Befehl.
Noumenon
8
In allen Versionen von bash, die ich verwendet habe, können Sie entweder interaktiv oder in einem Skript eine wörtliche Newline in eine Zeichenfolge einfügen, sofern die Zeichenfolge in Anführungszeichen steht.
echo
obligatorisch? Sie können verwendenprintf
.\r
Include zur Ausgabe oder ist es Teil vonCRLF
Newline?echo
Befehlen, die nicht miteinander kompatibel sind. Daher wird empfohlen, mehr Standardwerkzeug als zu verwendenprintf
. Unter unix.stackexchange.com/questions/65803/… finden Sie eine erweiterte Übersicht über das Problem.Antworten:
echo
Eine
echo
Implementierung, die sich strikt an die Single Unix-Spezifikation hält, fügt neue Zeilen hinzu, wenn Sie Folgendes tun:Das ist aber kein verlässliches Verhalten. Tatsächlich gibt es wirklich kein Standardverhalten, das Sie erwarten können
echo
.Und so gibt es wirklich keinen allgemeinen Weg, wie man eine neue Zeile schreibt
echo
, außer dass man sich im Allgemeinen darauf verlassen kannecho
, dies einfach zu tun.Eine
bash
Shell entspricht normalerweise nicht der Spezifikation und behandelt die-n
und andere Optionen, aber auch das ist ungewiss. Du kannst tun:Und nicht einmal das ist notwendig, wenn
bash
mit der Build-Time-Option gebaut wurde ...printf
Auf der anderen Seite ist
printf
das Verhalten im Vergleich ziemlich zahm.Es behandelt Format-Strings, die ihre Argumente beschreiben - das kann eine beliebige Anzahl von Dingen sein, aber für Strings sind es so ziemlich entweder
%b
Yte-Strings oder Literal-%s
Trings. Anders als die%f
Ormats im ersten Argument verhält es sich am%b
ähnlichsten wie ein Yte-String-Argument, außer dass es das\c
Escape nicht behandelt .Sehen Sie, warum ist
printf
besser alsecho
? für mehr.echo() printf
Sie könnten Ihre eigenen Standards konform schreiben
echo
wie ...... was eigentlich immer automatisch das Richtige tun sollte.
Eigentlich nein ... Das gibt ein Literal
\n
am Ende der Argumente aus, wenn das letzte Argument mit einer ungeraden Anzahl von <Backslashes> endet .Das tut es aber nicht:
quelle
shopt -s xpg_echo
Option .echo
-e
-e
. Ich bin überrascht, dass niemand das bemerkt hat, außer vielleicht @HaydeSchiffÜbergeben Sie das Flag -e an echo, damit maskierte Zeichen wie "\ r \ n" wie folgt analysiert werden:
quelle
echo
die unzuverlässig ist und im Gegensatz zu anderen Standards nicht den Standards folgtprintf
.tr -d "\n"
Befehl.In allen Versionen von bash, die ich verwendet habe, können Sie entweder interaktiv oder in einem Skript eine wörtliche Newline in eine Zeichenfolge einfügen, sofern die Zeichenfolge in Anführungszeichen steht.
Interaktiv:
In einem Skript:
quelle
Weitere Nutzungsmöglichkeiten:
quelle
Die Leute haben bereits angemessen geantwortet, aber ich lehne es ab, eine Welt zu akzeptieren, in der Echo jede andere Option als akzeptiert
-n
.quelle
Wenn Sie einen Charakter haben, der nicht Teil der Nachricht ist, können Sie sed weiterleiten
quelle