ubuntuusers.de

Dollarzeichen vor single Quotes

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Umaash

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Ich hatte das Gefühl, dass ich folgendes herausgefunden habe: "Ein Dollarzeichen vor "single Quotes" verwandelt die Backslashs wieder in Sonderzeichen zurück, so dass sie als solche interpretiert werden können. Das ist die einzige Funktion von Dollarzeichen vor "single Quotes"."

Also habe ich angefangen, diese "Behauptung" zu überprüfen. (Es geht mir nur darum, zu wissen, ob diese Behauptung stimmt oder nicht.)

Bei diesen Beispielen verwandelt wie erwartet "$" vor den single Quotes die Strings "\" in Sonderzeichen zurück und interpretiert sie:

1
2
3
echo 'This is a simple string.'
echo $'This is a string with a\nnewline.'
echo $'This is a string with a\ttab.'

Der folgende Befehl scheint meine Erwartung auch zu bestätigen:

1
2
3
$ echo $'2g.h"f*$g"fdd/f#@%q\n&=f\g\\//==?+[]{|()^`n`r`a\d,\s\w\t\r'
2g.h"f*$g"fdd/f#@%q
&=f\g\//==?+[]{|()^`n`r`a\d,\s\w	

\n wird als Zeilenumbruch interpretiert und \t und \r werden wohl auch irgendwie interpretiert. \g, \d, \s, \w bedeutet wohl nichts.

Soweit alles wie erwartet.

Nun nehme ich den gleichen Befehl noch einmal, aber verlängere die Zeichenkette um \p:

1
2
3
$ echo $'2g.h"f*$g"fdd/f#@%q\n&=f\g\\//==?+[]{|()^`n`r`a\d,\s\w\t\r\p'
2g.h"f*$g"fdd/f#@%q
\pf\g\//==?+[]{|()^`n`r`a\d,\s\w	

Weshalb ist jetzt nach dem Zeilenumbruch plötzlich "=&" verschwunden und durch "\p" ersetzt worden?

Ich hätte eigentlich folgenden Output erwartet:

1
2
2g.h"f*$g"fdd/f#@%q
&=f\g\//==?+[]{|()^`n`r`a\d,\s\w	\p

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Weil \r den Cursor an den Zeilenanfang schiebt und von dort aus die Ausgabe überschreibt. Klemm ein | hexdump -C dahinter und du siehst die tatsächliche Ausgabe.

Auf diese und ähnliche Art funktionieren dann auch Fortschrittsbalken und ähnliches im Terminal, da wird die gleiche Zeile immer wieder überschrieben.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

Weil \r der Wagenrücklauf („carriage return“) ist, und den Cursor wieder an den Anfang der Zeile ”zurück fährt”.

$ echo $'Hallo\rXX'
XXllo

Das kann man beispielsweise nutzen um einen Countdown in der gleichen Zeile runter zählen zu lassen:

1
for i in $(seq 10 -1 0); do printf '%2d\r' $i; sleep 1; done

Welche Zeichen nach einem \ bei $'…'-Zeichenkettenliteralen eine besondere Bedeutung haben, und auch welche das ist, muss man nicht durch herumprobieren heraus finden, das ist selbstverständlich dokumentiert: ANSI-C Quoting.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Vielen Dank euch beiden. Das hat sehr geholfen. Ich bin froh, dass dieses Beispiel die anfängliche Behauptung nicht widerlegt hat.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

frostschutz schrieb:

Weil \r den Cursor an den Zeilenanfang schiebt und von dort aus die Ausgabe überschreibt. Klemm ein | hexdump -C dahinter und du siehst die tatsächliche Ausgabe.

Ich nehme gerne od -t cx1 statt hexdump, weil man da die Hex-Nummern direkt unterhalb der Zeichen sieht (und, weil ich mich nicht umgewöhnen will). ☺

Antworten |