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]
War es hilfreich?

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:

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

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}]"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top