Wie kann ich ein oder mehrere Tabulatorzeichen mithilfe eines Bash-Skripts wiedergeben? Wenn ich diesen Code ausführe
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
Ich verstehe das
res=[ x] # that is [<space>x]
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 undmake
Aufrufe,/bin/sh
die normalerweise nicht vom Programm verwendet werden, interaktiv verwendet werden und normalerweise nicht-e
implementiert sind. Verwenden Sieprintf '\t'
stattdessen für die Portabilität .man
Seite für denecho
Befehl nicht erwähnt-e
. Diese Option wird jedoch akzeptiert.Verwenden Sie
printf
nichtecho
.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 derecho
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 vonecho
. 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:
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:wie kmkaplan schrieb (vor zweieinhalb Jahren habe ich es gerade bemerkt!). Das Problem mit Ihren ursprünglichen Befehlen:
ist nicht mit
echo
; Es ist so, dass die Shell die Lasche durch ein Leerzeichen ersetzt hat, bevor sieecho
jemals gesehen wurde.echo
ist in Ordnung für einfache Ausgabe, wieecho hello world
, aber Sie sollten verwenden,printf
wann immer Sie etwas komplexeres tun möchten. Sie können sichecho
an die Arbeit machen, aber der resultierende Code schlägt wahrscheinlich fehl, wenn Sie ihn mit einer anderenecho
Implementierung oder einer anderen Shell ausführen .quelle
Setzen Sie Ihre Zeichenfolge zwischen doppelte Anführungszeichen:
quelle
Sie können auch versuchen:
quelle
Sie müssen das Flag -e für das Echo verwenden, dann können Sie
quelle
Von der Bash-Manpage:
So können Sie Folgendes tun:
quelle
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:
Bash-Dokumente ( siehe "Quoted-Insert")
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- -
Hinweis: Sie können diese Strategie mit allen möglichen ungewöhnlichen Charakteren verwenden. Wie ein Wagenrücklauf:
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 Siels^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.quelle
grep
Zeilen mittab
Zeichen zu fangen .Die Verwendung von Echo zum Drucken von Variablenwerten ist eine häufige Gefahr für Bash. Referenzlink:
http://mywiki.wooledge.org/BashPitfalls#echo_.24foo
quelle
Wenn Sie
echo "a\tb"
in einem Skript verwenden möchten , führen Sie das Skript wie folgt aus:Alternativ können Sie myscript.sh die Ausführungsberechtigung erteilen und dann das Skript ausführen.
quelle
quelle