465 Stimmen

Tabulatoren in Bash-Skripten anzeigen

Wie gebe ich ein oder mehrere Tabulatorzeichen mit einem Bash-Skript aus? Wenn ich diesen Code ausführe

res='       'x # res = "\t\tx"
echo '['$res']' # erwarte [\t\tx]

Bekomme ich das

res=[ x] # das ist [x]

764voto

Johannes Weiss Punkte 49967
echo -e ' \t '

wird 'Leerzeichen Tabulator Leerzeichen Zeilenumbruch' ausgeben (-e bedeutet 'Interpretation von Backslash-Steuerzeichen aktivieren'):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|

1 Stimmen

Danke Johannes. Du hast mir geholfen, diese Lösung zu finden: res='\t\t'x; echo -e '['$res']'

2 Stimmen

Hast du zufällig eine Ahnung, warum echo -e aus Makefiles heraus nicht funktioniert?

33 Stimmen

Das liegt daran, dass echo -e nicht POSIX-konform ist und make /bin/sh aufruft, das normalerweise nicht das Programm ist, das Sie interaktiv verwenden, und normalerweise nicht -e implementiert hat. Verwenden Sie für Portabilität stattdessen printf '\t'.

96voto

Keith Thompson Punkte 240701

Verwende printf, nicht echo.

Es gibt verschiedene Versionen des echo-Befehls. Es gibt /bin/echo (was je nach System die GNU Coreutils-Version sein kann oder nicht), und der echo-Befehl ist in den meisten Shells integriert. Unterschiedliche Versionen haben unterschiedliche Möglichkeiten (oder keine Möglichkeit), Steuerzeichen zu spezifizieren oder zu deaktivieren.

printf hingegen hat viel weniger Variationen. Es kann als Befehl existieren, normalerweise /bin/printf, und es ist in einigen Shells enthalten (bash und zsh haben es, tcsh und ksh nicht), aber die verschiedenen Versionen ähneln sich viel mehr als die verschiedenen Versionen von echo. Und Sie müssen sich nicht an Befehlszeilenoptionen erinnern (mit einigen Ausnahmen; GNU Coreutils printf akzeptiert --version und --help, und das eingebaute 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 an der Zeit zuzugeben, dass echo genauso gut für das Beispiel funktioniert, über das Sie fragen; Sie müssen nur doppelte Anführungszeichen um das Argument setzen:

echo "[$res]"

wie kmkaplan (vor zweieinhalb Jahren, das ist mir gerade aufgefallen!) geschrieben hat. Das Problem mit Ihren Originalbefehlen:

res='           'x # res = "\t\tx"
echo '['$res']' # erwarte [\t\tx]

liegt nicht an echo; die Shell hat das Tab durch einen Leerzeichen ersetzt, bevor es von echo überhaupt gesehen wurde.

echo eignet sich gut für einfache Ausgaben, wie echo Hallo Welt, aber Sie sollten printf verwenden, wenn Sie etwas Komplexeres tun möchten. Sie können echo dazu bringen zu funktionieren, aber der resultierende Code wird wahrscheinlich fehlschlagen, wenn Sie ihn mit einer anderen echo-Implementierung oder einer anderen Shell ausführen.

1 Stimmen

Ich mochte diesen, er erlaubt mir, das Wissen über printf und alle Formatierungsanweisungen zu nutzen.

0 Stimmen

@JezenThomas: Es wird nicht höher bewertet, weil es die Frage auf eine andere Weise beantwortet als erbeten. Die Frage erwähnt ausdrücklich "echo", und "echo" ist kein Verb, sondern ein Befehl.

0 Stimmen

@PauloNeves: Ich würde sagen, es wird als Verb in der Frage verwendet: "Wie echo ich ein oder mehrere Tabulatoren mit einem Bash-Skript?"

76voto

jbatista Punkte 2507

Sie können auch versuchen:

echo Hallo$'\t'Welt.

13 Stimmen

+1 für eine allgemeinere Lösung. Ich benutze seit Jahren Bash und habe das gerade erst gelernt!

1 Stimmen

Dies ist viel allgemeiner als die akzeptierte Antwort, da es ohne Echo verwendet werden kann.

2 Stimmen

Das scheint auch zu funktionieren: $'Hello\tWorld'

36voto

kmkaplan Punkte 18205

Geben Sie Ihren String zwischen doppelten Anführungszeichen ein:

echo "[$res]"

1 Stimmen

Gleich hier - das ist, was ich zuerst versucht habe. -e hat jedoch gut funktioniert.

2 Stimmen

@kmkaplan Funktioniert bei mir in zsh - scheitert bei mir in bash.

29voto

Learning Punkte 7731

Sie müssen die -e Flagge für echo verwenden, dann können Sie

echo -e "\t\t x"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X