Echo Tabulatoren in Bash-Skript
Frage
Wie echo ich eine oder mehrere Tabulatoren mit einem Bash-Skript? Wenn ich diesen Code ausführen
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
ich diese
res=[ x] # that is [<space>x]
Lösung
echo -e ' \t '
wird echo 'Raum Registerkarte Raum Newline' (-e
bedeutet 'Interpretation von Backslash ermöglichen entkommt'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
Andere Tipps
Verwenden printf
, nicht echo
.
Es gibt mehrere verschiedene Versionen des echo
Befehl. Es gibt /bin/echo
(die kann oder auch nicht das GNU Coreutils Version sein, je nach System) und der echo
Befehl in den meisten Schalen gebaut wird. Verschiedene Versionen haben verschiedene Möglichkeiten (oder keine Möglichkeit) zu spezifizieren oder deaktivieren Fluchten für Steuerzeichen.
printf
, auf der anderen Seite, hat viel weniger Variation. Es kann als ein Befehl vorhanden ist, typischerweise /bin/printf
, und es ist in einigen Muscheln gebaut (bash und zsh es haben, tcsh und KSH nicht), aber die verschiedenen Versionen sind viel ähnlicher zueinander als die verschiedenen Versionen von echo
sind. Und Sie müssen nicht Befehlszeilenoptionen erinnern (mit wenigen Ausnahmen, GNU Coreutils printf akzeptiert --version
und --help
, und die eingebauten in bash printf übernimmt -v var
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, dass echo
zugeben werden Sie fragen, um genauso gut für das Beispiel arbeiten; Sie müssen nur doppelte Anführungszeichen um das Argument zu setzen:
echo "[$res]"
als kmkaplan schrieb (zweieinhalb Jahren, ich habe gerade bemerkt!). Das Problem mit dem Original-Befehlen:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
ist nicht mit echo
; es ist, dass der Schal auf die Registerkarte mit einem Leerzeichen ersetzt, bevor echo
jemals gesehen hat.
echo
ist gut für einfache Ausgabe, wie echo hello world
, aber Sie sollten printf
verwenden, wenn Sie etwas komplizierter machen wollen. Sie können erhalten echo
zu arbeiten, aber der resultierende Code wird wahrscheinlich fehlschlagen, wenn Sie es mit einer anderen echo
Implementierung oder einer anderen Shell ausgeführt werden.
Setzen Sie Ihre Zeichenfolge zwischen double Zitate:
echo "[$res]"
Sie können auch versuchen:
echo Hello$'\t'world.
Sie müssen für -e Flag verwenden echo, dann können Sie
echo -e "\t\t x"
Von der bash man-Seite:
Worte der Form $ 'String' sind speziell behandelt. Das Wort expandiert zu bespannen, mit Backslash-Escape-Zeichen wie angegeben durch den Standard ANSI C ersetzt.
So können Sie dies tun:
echo $'hello\tworld'
echo Verwenden von Werten von Variablen zu drucken ist eine gemeinsame Bash pitfall. Referenz-Link:
Mit dem wörtlich Tastendruck, ^V
(CTRL+V
, C-v
, Was ).
Wenn Sie ^V
in das Terminal (oder in den meisten Unix-Editoren) eingeben, wird das folgende Zeichen genommen wörtlich . Sie können diese verwenden, um ein wörtliches Tab-Zeichen in einem String geben Sie Echo.
So etwas wie die folgenden Werke:
echo "^V<tab>" # CTRL+V, TAB
Bash docs ( qv "zitierte-insert")
quoted-Einsatz (C-q, C-v) Fügen Sie das nächste Zeichen, die Sie in die Zeile wörtlich eingeben. Dies ist, wie Tastenfolgen wie C-q einzufügen, zum Beispiel.
side note: nach diesem ALT+TAB
sollten das gleiche tun, aber wir haben alle diese Sequenz zu Fenster gebunden Schalt so können wir es nicht verwenden
Tab-Einsatz (M-TAB) Legen Sie ein Tab-Zeichen.
-
Hinweis: Sie können mit dieser Strategie mit allen möglichen Sonderzeichen. Wie ein Wagenrücklauf:
echo "^V^M" # CTRL+V, CTRL+M
Das ist, weil Wagenrücklauf ASCII ist 13 und M ist der 13. Buchstabe des Alphabets, also wenn Sie ^M
eingeben, erhalten Sie den 13. ASCII-Zeichen. Sie können es in Aktion sehen ls^M
verwenden, an einem leeren Prompt, der einen Wagenrücklauf eingefügt werden, so dass die Eingabeaufforderung wie Sie Rückkehr getroffen handeln. Wenn diese Zeichen normalerweise interpretiert werden, wörtlich werden erhalten Sie den wörtlichen Charakter.
Wenn Sie echo "a\tb"
in einem Skript verwenden möchten, können Sie das Skript wie:
# sh -e myscript.sh
Alternativ können Sie geben die Ausführungsberechtigung für myscript.sh, und dann das Skript ausführen.
# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"