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
Variablen-Zuweisung in der Bash
Re: Variablen-Zuweisung in der Bash
Ja und ja.Mic_2004 wrote:Kann mir jemand einen Tipp geben?
Habe ich einen grundsätzlichen Denkfehler?
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]}
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
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..."