Antworten:
echo -e ' \t '
gibt 'Leerzeichen Tab Leerzeichen Zeilenumbruch' aus ( -e
bedeutet 'Interpretation von Backslash- Escapezeichen aktivieren'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
funktioniert das nicht mit Makefiles?
echo -e
liegt daran, dass nicht POSIX und make
Aufrufe, /bin/sh
die normalerweise nicht vom Programm verwendet werden, interaktiv verwendet werden und normalerweise nicht -e
implementiert sind. Verwenden Sie printf '\t'
stattdessen für die Portabilität .
man
Seite für den echo
Befehl nicht erwähnt -e
. Diese Option wird jedoch akzeptiert.
Verwenden Sie printf
nicht echo
.
Es gibt mehrere verschiedene Versionen des echo
Befehls. Es gibt /bin/echo
(je nach System kann es sich um die GNU Coreutils-Version handeln oder nicht), und der echo
Befehl ist in die meisten Shells integriert. Verschiedene Versionen haben unterschiedliche Möglichkeiten (oder keine Möglichkeit), Escapezeichen für Steuerzeichen anzugeben oder zu deaktivieren.
printf
hat andererseits viel weniger Variation. Es kann normalerweise als Befehl existieren /bin/printf
und ist in einige Shells integriert (bash und zsh haben es, tcsh und ksh nicht), aber die verschiedenen Versionen sind einander viel ähnlicher als die verschiedenen Versionen von echo
. Und Sie müssen sich keine Befehlszeilenoptionen merken (mit wenigen Ausnahmen; GNU Coreutils printf akzeptiert --version
und --help
, und die integrierte Bash printf akzeptiert -v var
, um die Ausgabe in einer Variablen zu speichern).
Für Ihr Beispiel:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
Und jetzt ist es Zeit für mich zuzugeben, dass dies echo
für das Beispiel, nach dem Sie fragen, genauso gut funktioniert. Sie müssen nur doppelte Anführungszeichen um das Argument setzen:
echo "[$res]"
wie kmkaplan schrieb (vor zweieinhalb Jahren habe ich es gerade bemerkt!). Das Problem mit Ihren ursprünglichen Befehlen:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
ist nicht mit echo
; Es ist so, dass die Shell die Lasche durch ein Leerzeichen ersetzt hat, bevor sie echo
jemals gesehen wurde.
echo
ist in Ordnung für einfache Ausgabe, wie echo hello world
, aber Sie sollten verwenden, printf
wann immer Sie etwas komplexeres tun möchten. Sie können sich echo
an die Arbeit machen, aber der resultierende Code schlägt wahrscheinlich fehl, wenn Sie ihn mit einer anderen echo
Implementierung oder einer anderen Shell ausführen .
Sie können auch versuchen:
echo Hello$'\t'world.
Von der Bash-Manpage:
Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert, wobei Zeichen mit Backslash-Escapezeichen gemäß ANSI C-Standard ersetzt werden.
So können Sie Folgendes tun:
echo $'hello\tworld'
Verwenden Sie den wörtlich Tastendruck, ^V
( CTRL+V
, C-v
, was auch immer ).
Wenn Sie ^V
in das Terminal (oder in den meisten Unix-Editoren) eingeben, wird das folgende Zeichen wörtlich genommen . Sie können dies verwenden, um ein Literal-Tabulatorzeichen in eine Zeichenfolge einzugeben, die Sie wiedergeben.
So etwas funktioniert wie folgt:
echo "^V<tab>" # CTRL+V, TAB
Bash-Dokumente ( siehe "Quoted-Insert")
Anführungszeichen (Cq, Cv) Fügen Sie das nächste Zeichen, das Sie eingeben, wörtlich in die Zeile ein. So fügen Sie beispielsweise Schlüsselsequenzen wie Cq ein.
Randnotiz: Demnach ALT+TAB
sollte man dasselbe tun, aber wir haben alle diese Sequenz an das Umschalten des Fensters gebunden, damit wir sie nicht verwenden können
Tabulator einfügen (M-TAB) Fügen Sie ein Tabulatorzeichen ein.
- -
Hinweis: Sie können diese Strategie mit allen möglichen ungewöhnlichen Charakteren verwenden. Wie ein Wagenrücklauf:
echo "^V^M" # CTRL+V, CTRL+M
Dies liegt daran, dass der Wagenrücklauf ASCII 13 ist und M der 13. Buchstabe des Alphabets ist. Wenn Sie also eingeben ^M
, erhalten Sie das 13. ASCII-Zeichen. Sie können es in Aktion sehen, indem Sie ls^M
an einer leeren Eingabeaufforderung einen Wagenrücklauf einfügen, wodurch die Eingabeaufforderung so funktioniert, als würden Sie die Eingabetaste drücken. Wenn diese Zeichen normalerweise interpretiert werden, wörtlich bekommt man den wörtlichen Charakter bekommen.
grep
Zeilen mit tab
Zeichen zu fangen .
Die Verwendung von Echo zum Drucken von Variablenwerten ist eine häufige Gefahr für Bash. Referenzlink: