echo
Eine echoImplementierung, die sich strikt an die Single Unix-Spezifikation hält, fügt neue Zeilen hinzu, wenn Sie Folgendes tun:
echo 'line1\nline2'
Das ist aber kein verlässliches Verhalten. Tatsächlich gibt es wirklich kein Standardverhalten, das Sie erwarten können echo.
OPERANDEN
string
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 ...
--enable-xpg-echo-default
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.
RATIONALE
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 .
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Sehen Sie, warum ist printfbesser als echo? für mehr.
echo() printf
Sie könnten Ihre eigenen Standards konform schreiben echowie ...
echo(){
printf '%b ' "$@\n\c"
}
... was eigentlich immer automatisch das Richtige tun sollte.
Eigentlich nein ... Das gibt ein Literal \nam Ende der Argumente aus, wenn das letzte Argument mit einer ungeraden Anzahl von <Backslashes> endet .
Das tut es aber nicht:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echoobligatorisch? Sie können verwendenprintf.