Variablen-Zuweisung in der Bash

Post Reply
Message
Author
Mic_2004

Variablen-Zuweisung in der Bash

#1 Post by Mic_2004 »

COUNT=1
VAR${COUNT}="xyz"

bash: VAR1=xyz: command not found

Warum wird hier versucht ein Kommando auszuführen und nicht der String xyz der Variablen VAR1 zugewiesen?

Das Ganze soll sich eigentlich in einer Schleife abspielen, so dass nach jedem Durchlauf die Variable VAR1, VAR2, VAR3 usw. hochgezählt wird.
Den Teil mit der Schleife, die ansonsten funktioniert, habe ich hier der Übersicht halber weggelassen.

Ich habe mit verschiedenen Arten des Quotens erfolglos experimentiert.

Kann mir jemand einen Tipp geben?
Habe ich einen grundsätzlichen Denkfehler?

Danke!
Gruß
Michael

df -h

#2 Post by df -h »

VARIABLE="das istder inhalt"

oerr auch irgendwie so: VARIABLE=$("test")

oder in der shell wars glaub: export VARIABLE="var"

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

Re: Variablen-Zuweisung in der Bash

#3 Post by jochen »

Mic_2004 wrote:Kann mir jemand einen Tipp geben?
Habe ich einen grundsätzlichen Denkfehler?
Ja und ja. ;)

Die Shell hat eine feste Reihenfolge, in der sie jede Eingabe abarbeitet. Sieh mal in die bash-Manpage unter "Simple Command Expansion" und "Command Execution". Das Auflösen des "=" als Variablenzuweisung findet früh statt. Da davor aber (zu dem Zeitpunkt) noch kein Variablenname steht ($ darf nicht Bestandteil des Namens sein), wird das Gleichheitszeichen hier nicht als "Zuweiung an Variable" gewertet. Später wird für $COUNT der ebtsprechende Wert zwar eingefügt, aber das Ergebnis inkl. Gleichheitszeichen und folgendem Wert als ein einziges Wort genommen, weil keine Blanks drinne vorkommen, und als erstes Wort der Kommandozeile versucht auszuführen.

Die einfache Lösung sind Arrays, die in der bash (oder der ksh oder der zsh) funktionieren:

Code: Select all

for COUNT in 1 2 3 4 ; do VAR[$COUNT]="irgendwas" ; done
echo ${VAR[3]}
Genaueres findest Du in der bash-Manpage unter "Arrays".

Wenn es um Bourne-Shell-Kompatibilität geht, musst Du in den sauren Apfel beissen und eval verwenden:

Code: Select all

for COUNT in 1 2 3 4 ; do eval 'VAR'$COUNT'="irgendwas"' ; done
echo $VAR3
eval zwingt die Shell in einen zweiten Lauf über die Kommandozeile mit allen Ersetzungen, die es da so gibt. In Lauf 1 wird $COUNT durch den Wert der Variablen ersetzt, alles weitere bleibt (da in Hochkommata) unverändert. Für den zweiten durchlauf steht da also

VAR3="irgendwas"

Und so wird die variable dann auch gesetzt. Das ganze ist m.E. schwer zu verstehen, fehleranfällig und schwer zu lesen, aber es funktioniert eben auch in der alten sh.

Hat das die Nebel gelichtet?

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Mic_2004

#4 Post by Mic_2004 »

Hallo Jochen,

vielen Dank für die ausführliche Erklärung und die sehr anschaulichen Beispiele.

Ich habe mir die von Dir vorgeschlagene Array-Variante genauer angesehen und konnte damit mein Problem lösen und habe wieder etwas dazu gelernt. :)

Vielen Dank nochmal!

Gruß
Michael

Post Reply