it-swarm.com.de

Echo Tab-Zeichen in Bash-Skript

Wie kann ich ein oder mehrere Tabulatorzeichen mit einem Bash-Skript wiederholen? 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]
236
kalyanji
echo -e ' \t '

wird 'Leerzeichen' als Leerzeichen wiederholen (-e bedeutet 'Interpretation von Backslash-Escape-Elementen')

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

Verwenden Sie printf, nicht echo.

Es gibt mehrere verschiedene Versionen des Befehls echo. Es gibt /bin/echo (dies kann je nach System die GNU Coreutils-Version sein oder nicht), und der Befehl echo ist in die meisten Shells eingebaut. Verschiedene Versionen haben unterschiedliche Möglichkeiten (oder keine Möglichkeit), Escapezeichen für Steuerzeichen anzugeben oder zu deaktivieren.

printf hat dagegen viel weniger Variationen. Es kann als Befehl existieren, normalerweise /bin/printf, und es 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 von echo. 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 dein Beispiel:

res='           'x # res = "\t\tx"
printf '%s\n' "[$res]"

Und jetzt ist es Zeit für mich zuzugeben, dass echo genauso gut für das Beispiel funktioniert, nach dem Sie fragen; Sie müssen lediglich das Argument in doppelte Anführungszeichen setzen:

echo "[$res]"

wie kmkaplan schrieb (vor zweieinhalb Jahren habe ich gerade bemerkt!). Das Problem mit Ihren ursprünglichen Befehlen:

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

ist nicht mit echo; Es ist so, dass die Shell die Registerkarte durch ein Leerzeichen ersetzt hat, bevor echo sie je gesehen hat.

echo eignet sich gut für einfache Ausgaben, wie echo hello world. Sie sollten jedoch printf verwenden, wenn Sie etwas komplexeres tun möchten. Kannecho zum Laufen bringen, der resultierende Code schlägt jedoch fehl, wenn Sie ihn mit einer anderen echo-Implementierung oder einer anderen Shell ausführen.

61
Keith Thompson

Setzen Sie Ihre Zeichenfolge zwischen double quotes:

echo "[$res]"
31
kmkaplan

Sie können auch versuchen:

echo Hello$'\t'world.
25
jbatista

sie müssen -e-Flag für das Echo verwenden 

echo -e "\t\t x"
17
Learning

Die Verwendung von Echo zum Drucken von Werten von Variablen ist eine häufige Bash-Fallgrube . Referenzlink:

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

11
Anonymous

Von der Bash-Man-Seite:

Wörter der Form $ 'string' werden speziell behandelt. Das Word wird zu Zeichenfolge erweitert, wobei durch Backslash-Zeichen ersetzte Zeichen gemäß dem ANSI-C-Standard ersetzt werden.

So kannst du das machen:

echo $'hello\tworld'
11
esoriano

Verwenden Sie den ausführlichen Tastenanschlag ^V (CTRL+V, C-v, was auch immer).

Wenn Sie ^V in das Terminal (oder in die meisten Unix-Editoren) eingeben, wird das folgende Zeichen wörtlich verwendet. Sie können dies verwenden, um ein Literal-Tabulatorzeichen in eine Zeichenfolge einzugeben, die Sie wiederholen.

So etwas wie die folgenden Arbeiten:

echo "^V<tab>"     # CTRL+V, TAB

Bash-Dokumente (q.v., "quoted-insert")

anführungszeichen (C-q, C-v) Fügen Sie das nächste Zeichen, das Sie eingeben, wortwörtlich hinzu. So fügen Sie beispielsweise Tastenfolgen wie C-q ein.

Randbemerkung: Demnach sollteALT+TABdasselbe tun, aber wir haben alle diese Sequenz an die Fensterumschaltung gebunden, sodass wir sie nicht verwenden können.

tabulator einfügen (M-TAB) Fügen Sie ein Tabulatorzeichen ein.

-

Hinweis: Sie können diese Strategie mit allen möglichen ungewöhnlichen Zeichen verwenden. Wie ein Wagenrücklauf:

echo "^V^M"        # CTRL+V, CTRL+M

Dies liegt daran, dass der Wagenrücklauf ASCII 13 ist und M der 13. Buchstabe des Alphabets ist. Wenn Sie ^M eingeben, erhalten Sie das 13. ASCII - Zeichen. Sie können es mit ls^M bei einer leeren Eingabeaufforderung in Aktion sehen, wodurch ein Wagenrücklauf eingefügt wird, der bewirkt, dass die Eingabeaufforderung genauso wirkt, wie Sie die Eingabetaste drücken. Wenn diese Zeichen normalerweise interpretiert werden, erhalten Sie mit wörtlich den wörtlichen Buchstaben.

7
rich remer

Wenn Sie echo "a\tb" in einem Skript verwenden möchten, führen Sie das Skript folgendermaßen aus:

# sh -e myscript.sh

Alternativ können Sie myscript.sh die Ausführungsberechtigung erteilen und dann das Skript ausführen.

# chmod +x myscript.sh
# ./myscript.sh
2
ATC
res="\t\tx"
echo -e "[${res}]"
0
yanghaogn