ubuntuusers.de

Ausgabe des Variableninhalts: ""

Status: Ungelöst | Ubuntu-Version: Ubuntu 22.10 (Kinetic Kudu)
Antworten |

Umaash

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Hallo zusammen

Die einzige Erfahrung, die ich mit Programmierung habe ist die Programmierung eines "einzeiligen" Pocket Computers von Sharp mit 0.0018 MB Speicher vor 30 Jahren. Die Programmiersprache war Basic.

Die Berücksichtigung von Leerzeichen war dort nicht nötig. Wenn man einer String-Variablen eine Zeichenkette zugewiesen hat, dann tippte man das so ein:

StringVariable="mein Inhalt"

Wenn man dann Enter gedrückt hat, dann sah das danach so aus:

StringVariable = "mein Inhalt"

Was ist der Unterschied? Es wurden automatisch Leerzeichen eingefügt,wo sie notwendig sind. Man brauchte sich also nicht um Leerzeichen zu kümmern, ausser sie befinden sich in einer Zeichenkette. Zur Kennzeichnung einer Zeichenkette wurden immer die Zeichen "" verwendet.

Da ich mich mit Linux Bash beschäftigen will, damit ich das Terminal benutzen kann, habe ich mich umgeschaut, und folgende Seite gefunden: https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/

Zuerst war ich begeistert, weil auf dieser Seite genau die Kleinigkeiten wie:

Wann braucht es ", wann ', wann Leerzeichen, und wann nicht, und wann braucht es (, wann { und so weiter, scheint erklärt zu werden.

Ich kam mit dem Tutorial auch gut zurecht, bis ich hier war. (Bitte Anhang beachten)

Zitat: "Variablen werden mit echo ausgegeben. Dabei muss man ein Dollarzeichen $ vor den Namen der Variablen setzen."

Aufgrund dieser Erklärung würde ich jetzt erwarten, dass der Befehl für die Variablen-Ausgabe folgendermassen aussehen würde:

echo $message

Tatsächlich ist es gemäss Tutorial aber:

echo "$message"

Dem lernwilligen Anfänger wird also die Funktion der "" Zeichen in diesem Befehl einfach untergejubelt.

Noch verwirrter war ich, als ich feststellen musste, dass folgendes trotzdem funktioniert:

echo $message

Danach habe ich noch folgendes ausgetestet:

echo $"message"

Was dann aber nicht funktioniert hat.

Frage: Was bedeuten die "" im Befehl

echo "$message"

Ich würde mich freuen, wenn ihr mir alle Funktionen, die "" in Bash hat, erläutern könntet. Wann braucht es "" ? Wann braucht es keine "" ? Wann darf man sie nicht benutzen, wann muss man sie benutzen?

Antworten würden mich freuen.

Besten Dank.

(Ich habe auch schon andere Tutorials im Internet gefunden. Dort werden aber jeweils die häufigsten Befehle erklärt. Bevor ich mich mit spezifischen Befehlen beschäftigen will, möchte ich mich aber zuerst mit der Syntax beschäftigen: " ' ( { $ usw. )

Bearbeitet von ChickenLipsRfun2eat:

Aus dem Spamfilter gefischt.

Bilder

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

Wenn Du nicht weißt, was der Inhalt der Variable sein wird (weil es z.B. ein Laufzeitinput ist), empfiehlt es sich, eine Variable zu quoten, weil sonst die Shell ihre anderen "Expansions" nutzt. Beispiel:

1
2
3
4
5
6
7
8
$ touch ab ac cd
$ ls
ab  ac  cd
$ var=a*
$ echo "$var"
a*
$ echo $var
ab ac

Siehe den Unterschied zwischen Zeile 6 und 8.

Die Syntax $'...' ist eine Spezialität der bash und erlaubt es, z.B. Sonderzeichen in eine Variable einzubauen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ var=a\nb
$ echo "$var"
anb
$ var=a\\b
$ echo "$var"
a\b
$ var=$'a\nb'
$ echo "$var"
a
b

Die Syntax $"..." gibt es m.W. nicht. Das Dollarzeichen wird hier ignoriert.

PS: Bitte formatiere Deine Beiträge mit Absätzen und Codeblocks, damit sie für die Leser leichter zu verstehen sind.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Besten Dank für die Antwort.

Das ist ja interessant.

In einem Deiner Beispiele hast Du der Variablen var den Inhalt a* zugewiesen: Beispiel 1:

1
$ var=a*

In einem anderen Beispiel hast Du der Variablen var den Inhalt a\nb zugewiesen: Beispiel 2:

1
$ var=$'a\nb'

Frage: Ist nicht sowohl * in a*, wie auch \n in a\nb ein Sonderzeichen?

Ich denke schon. Also hast Du mir eigentlich 2 Wege gezeigt, wie man Sonderzeichen in Variablen einbauen kann.

Variante 1: einfach so, ohne spezielle Vorkehrungen
Variante 2: mit $''

Also habe ich für beide Beispiele jeweils noch die andere Variante ausprobiert: Variante 2 mit Beispiel 1:

1
2
3
$ var=$'g*'
$ echo $var
gImageReader_crash-save_1.txt gImageReader_crash-save_2.txt gImageReader_crash-save.txt

Ergebnis: Es funktioniert.

Variante 1 mit Beispiel 2:

1
2
3
$ var=a\\nb
$ echo $var
a\nb

Ergebnis: Das Sonderzeichen \n wird nicht als Sonderzeichen behandelt.

Frage: Könnte man vielleicht sagen nur Sonderzeichen die aus mehr als einem Zeichen bestehen, benötigen ...

$''

Sonderzeichen, die aus nur einem Zeichen bestehen, benötigen nicht ...

$''

?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

Umaash schrieb:

Das ist ja interessant.

Ja, unbedingt - und anfänglich auch etwas verwirrend.

In einem Deiner Beispiele hast Du der Variablen var den Inhalt a* zugewiesen: Beispiel 1:

1
$ var=a*

In einem anderen Beispiel hast Du der Variablen var den Inhalt a\nb zugewiesen: Beispiel 2:

1
$ var=$'a\nb'

Frage: Ist nicht sowohl * in a*, wie auch \n in a\nb ein Sonderzeichen?

Ja, aber nicht immer. Es hängt von der Reihenfolge der verschiedenen Shell Expansions und davon, welche ausgeführt werden, ab, ob und wann diese als Sonderzeichen behandelt werden.

Ich denke schon. Also hast Du mir eigentlich 2 Wege gezeigt, wie man Sonderzeichen in Variablen einbauen kann.

Variante 1: einfach so, ohne spezielle Vorkehrungen
Variante 2: mit $''

Vorsicht, das sind zwei unterschiedliche Dinge! Bei der Variante 2 landet tatsächlich ein Newline in der Variablen. Bei der anderen Variante hast Du ein Zeichen, nämlich "n" oder zwei Zeichen, nämlich "\" und "n" in der Variable. Achte genau auf die Ausgaben (ich habe hier auch noch echo -e hinzugefügt, weil das nämlich der Weg ist, einen Newline auszugeben, wenn in der Zeichenkette die zwei Zeichen "\" und "n" stehen):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ var=a\nb
$ echo $var
anb
$ echo "$var"
anb
$ echo -e "$var"
anb
$ var=a\\nb
$ echo $var
a\nb
$ echo "$var"
a\nb
$ echo -e "$var"
a
b
$ var='a\nb'
$ echo $var
a\nb
$ echo "$var"
a\nb
$ echo -e "$var"
a
b
$ var=$'a\nb'
$ echo $var
a b
$ echo "$var"
a
b
$ echo -e "$var"
a
b

Also habe ich für beide Beispiele jeweils noch die andere Variante ausprobiert: Variante 2 mit Beispiel 1:

1
2
3
$ var=$'g*'
$ echo $var
gImageReader_crash-save_1.txt gImageReader_crash-save_2.txt gImageReader_crash-save.txt

Ergebnis: Es funktioniert.

Ja. Die Pathname Expansion passiert hier erst beim echo und zwar, weil Du die Variable nicht gequotet hast.

Variante 1 mit Beispiel 2:

1
2
3
$ var=a\\nb
$ echo $var
a\nb

Ergebnis: Das Sonderzeichen \n wird nicht als Sonderzeichen behandelt.

Weil da kein Sonderzeichen - also jedenfalls kein Newline - ist, sondern zwei Zeichen - "\" gefolgt von "n".

Frage: Könnte man vielleicht sagen nur Sonderzeichen die aus mehr als einem Zeichen bestehen, benötigen ...

$''

Sonderzeichen, die aus nur einem Zeichen bestehen, benötigen nicht ...

$''

?

Nein. "*" und "\n" sind für die Shell ganz verschiedene Dinge. Aus Sicht der Shell ist ein Newline, der als Newline in der Zeichenkette steht, Whitespace. Siehe die vielleicht etwas überraschende Ausgabe in Zeile 21. Dieses Zeichen hat seine "Magie" beim Word Splitting. Der Stern entfaltet seine "Magie" bei der Filename Expansion und expandiert Dateinamen, die auf das Muster passen.

Der Newline ist ja nur ein Zeichen. Es gibt halt die Konvention, dass man ihn in Text als "\n" (zwei Zeichen) darstellt. Und die Shell honoriert diese Konvention, indem sie bei echo -e die Umwandlung der zwei Zeichen "\n" in einen Newline durchführt. Aber es ist ein Unterschied, ob man einen Newline oder "\n" in einer Variable hat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ touch $'filename with\nnewline'
$ for f in *; do echo "$f"; done
filename with
newline
$ var='filename with\nnewline'
$ if [ -f "$var" ]; then echo found; else echo not found; fi
not found
$ var=$'filename with\nnewline'
$ if [ -f "$var" ]; then echo found; else echo not found; fi
found

Letztlich läuft es darauf hinaus, wann eine Sequenz wie "\n" in einen echten Newline umgewandelt wird. Wenn man $'\n' schreibt, passiert die Umwandlung hier. Wenn man '\n' schreibt, kann die Umwandlung später passieren.

Sorry für die Textwüste.

Antworten |