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]

28voto

esoriano Punkte 439

Vom bash-Manual:

Wörter der Form $'Zeichenkette' werden speziell behandelt. Das Wort wird zu Zeichenkette erweitert, wobei maskierte Zeichen gemäß dem ANSI-C-Standard ersetzt werden.

Damit können Sie dies tun:

echo $'hallo\twelt'

0 Stimmen

Warum funktioniert dies auf der Befehlszeile, aber nicht in einem Bash-Skript?

0 Stimmen

@Freek Es funktioniert für mich - vielleicht posten Sie Ihr Skript, wo es nicht funktioniert, als separate Frage?

22voto

rich remer Punkte 3193

Verwenden Sie die wörtliche Tastenkombination, ^V (CTRL+V, C-v, was auch immer).

Wenn Sie ^V in das Terminal eingeben (oder in den meisten Unix-Editoren), wird das folgende Zeichen wörtlich genommen. Sie können dies verwenden, um ein Literalzeichen einzugeben Tabulatorzeichen innerhalb eines Strings, den Sie wiedergeben.

So etwas wie das Folgende funktioniert:

echo "^V"     # CTRL+V, TAB

Bash-Dokumentation (siehe auch, "quoted-insert")

quoted-insert (C-q, C-v) Fügen Sie das nächste von Ihnen eingegebene Zeichen wörtlich in die Zeile ein. So fügen Sie beispielsweise Tastenkombinationen wie C-q ein.

Anmerkung: laut dieser ALT+TAB sollte das Gleiche tun, aber wir haben alle diese Sequenz für das Umschalten von Fenstern gebunden, sodass wir sie nicht verwenden können

tab-insert (M-TAB) Füge 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 also ^M eingeben, erhalten Sie das 13. ASCII-Zeichen. Sie können es in Aktion sehen, wenn Sie ls^M an einer leeren Eingabeaufforderung verwenden, was einen Wagenrücklauf einfügt und die Eingabeaufforderung dazu bringt, sich genau so zu verhalten, als hätten Sie die Eingabetaste gedrückt. Wenn diese Zeichen normalerweise interpretiert werden, erhalten Sie mit wörtlich das tatsächliche Zeichen.

1 Stimmen

Wünschte, ich könnte dir mehr Upvotes für dieses geben. Ich wollte in diesem Fall kein -e in meinen Argumenten verwenden, und das funktioniert super. Danke!

0 Stimmen

"... meisten Unix-Editoren"? Habe versucht, dies mit beiden vi und emacs einzugeben und es hat in keinem der beiden die gewünschten Ergebnisse geliefert.

0 Stimmen

Das ist soooo cool! Und hat meinen Tag gerettet, als ich versucht habe, grep zu verwenden, um Zeilen mit Tab-Zeichen zu finden.

12voto

Anonymous Punkte 2861

Die Verwendung von echo zum Drucken von Variablenwerten ist eine häufige Stolperfalle in Bash. Referenzlink:

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

0 Stimmen

Cool, ich mag die "BashPitfalls", großartiges Material und erleichtert mir viel Arbeit in meinem täglichen Leben!

0 Stimmen

+1, weil das sooo wahr ist. Beachten Sie jedoch, dass der Kalyanji-String mit einem "[" beginnt und kein "\" enthält.

2voto

ATC Punkte 29

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

# sh -e myscript.sh

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

# chmod +x myscript.sh
# ./myscript.sh

0voto

yanghaogn Punkte 797
res="\t\tx"
echo -e "[${res}]"

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