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]
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]
Danke Johannes. Du hast mir geholfen, diese Lösung zu finden: res='\t\t'x; echo -e '['$res']'
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'
.
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.
Ich mochte diesen, er erlaubt mir, das Wissen über printf und alle Formatierungsanweisungen zu nutzen.
@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.
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.