staging.inyokaproject.org

Anfängerfrage: Wie fügt man festen Text und den Inhalt einer Text-Variablen korrekt zusammen?

Status: Gelöst | Ubuntu-Version: Ubuntu 24.04 (Noble Numbat)
Antworten |

RudiRatlos58

Anmeldungsdatum:
6. Juli 2025

Beiträge: Zähle...

Ich bin ganz neu in das Thema Bash Skript eingestiegen. Schon bei den ersten Test-Ausgaben ist mir aufgefallen, dass eine Mischung aus festem Text und dem Inhalt einer Text-Variablen nicht den erwarteten String ergibt. Mir ist schon klar, dass das eine Frage nach den einfachsten Grundlagen ist. Aber alle gefundenen Beispiele mit dieser Mischung funktionieren bei mir nicht korrekt, sondern lassen Zeichen aus und/oder verdrehen die Reihenfolge. Dazu ein Beispiel:

#!/bin/bash
#
VAR1="abcdefghi"
VAR2="def"
VAR3="abc${VAR2}ghi"
VAR4="abc${VAR2}ghijkl"
echo "$VAR1"
echo "$VAR2"
echo "$VAR3"
echo "$VAR4"

Ausgabe:

abcdefghi
def
ghidef
ghijkl

Bei VAR3 wäre ja „abcdefghi“ zu erwarten. Aber „abc“ wurde weggelassen und „def“ kommt erst nach „ghi“.

Und bei VAR4 wäre ja „abcdefghijkl“ zu erwarten. Aber „abcdef“ wurde weggelassen.

Wer kann mir erklären wo der Fehler liegt?

Hintergrund-Info: Ich verwende Ubuntu 24.04.2 LTS und aktualisiere ständig. Als Editor für das Skript habe ich „Geany“ verwendet. (Da wird ganz unten angezeigt: … EOL:CRLF Kodierung:UTF-8 …)

Kreuzschnabel

Anmeldungsdatum:
12. Dezember 2011

Beiträge: 1768

RudiRatlos58 schrieb:

Bei VAR3 wäre ja „abcdefghi“ zu erwarten. Aber „abc“ wurde weggelassen und „def“ kommt erst nach „ghi“.

Und bei VAR4 wäre ja „abcdefghijkl“ zu erwarten. Aber „abcdef“ wurde weggelassen.

Läuft bei mir wie erwartet.

Hintergrund-Info: Ich verwende Ubuntu 24.04.2 LTS und aktualisiere ständig. Als Editor für das Skript habe ich „Geany“ verwendet. (Da wird ganz unten angezeigt: … EOL:CRLF Kodierung:UTF-8 …)

Versuch’s mal mit LF (ohne CR). CRLF ist das Windows-Zeilenende.

--ks

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Hallo RudiRatlos58

die Antwort hast du ja bereits auf deine Frage gegeben:

Da wird ganz unten angezeigt: … EOL:CRLF Kodierung:UTF-8 …

Du hast den Text im "Windows" Mode erstellt. Dadurch bekommst du ein zusätzliches "Return" (CR, \r, 0x0d) eingefügt. Schau dir mal deine tatsächliche Ausgabe an z.B. mit

$ . x.sh | od -c
0000000   a   b   c   d   e   f   g   h   i  \r  \r  \n   d   e   f  \r
0000020  \r  \n   a   b   c   d   e   f  \r   g   h   i  \r  \r  \n   a
0000040   b   c   d   e   f  \r   g   h   i   j   k   l  \r  \r  \n
0000057
$ 

Deine Befehlszeilen habe ich als Datei "x.sh" gesichert.

Ändere daher im "Geany" Editor unter "Dokument" → "Zeilenenden festlegen" → "Auf LF setzen und umwndeln (Unix)". Sichere die Datei, und es wird klappen:

$ . x.sh | od -c
0000000   a   b   c   d   e   f   g   h   i  \n   d   e   f  \n   a   b
0000020   c   d   e   f   g   h   i  \n   a   b   c   d   e   f   g   h
0000040   i   j   k   l  \n
0000045
$ 

RudiRatlos58

(Themenstarter)

Anmeldungsdatum:
6. Juli 2025

Beiträge: 5

Vielen, vielen Dank für eure sehr schnelle Hilfe. Die geänderte Einstellung in "Geany" hat das Problem sofort gelöst. Ich bin noch zu sehr Anfänger, um die Problematik mit dem störenden "CR" im Einzelnen genau nachvollziehen zu können. Wichtig für mich ist aber zunächst einmal, dass ich jetzt vernünftig weiter machen kann. Nochmals vielen Dank an Kreuzschnabel und Shiro.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Nur mal so als Bonusinfo: Here-Dokumente mit Shell-Variablen ergeben ein einfaches Template-System:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ foo=123
$ cat <<EOM
> start
> $foo
> oder: $foo
> end
> EOM
start
123
oder: 123
end

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

RudiRatlos58 schrieb:

Ich bin ganz neu in das Thema Bash Skript eingestiegen.

Wenn Du nicht neu ins Thema Programmierung überhaupt eingestiegen bist, dann ist hier noch eine zweite, wichtige Bonusinfo.

Mit Anführungszeichen in der Shell verhält es sich nicht so, wie man es aus den meisten anderen Programmiersprachen gewohnt ist.

Solange kein Whitespace in der Zeichenkette ist, sind Anführungsstriche überflüssig. Dein Beispiel funktioniert also genauso so:

#!/bin/bash
#
VAR1=abcdefghi
VAR2="def"
VAR3=abc${VAR2}ghi
VAR4="abc${VAR2}ghijkl"
echo $VAR1
echo $VAR2
echo "$VAR3"
echo $VAR4

Das war auch bei Ubuntu 5.10 nicht anders.

Antworten |