(Gelöst) Shellscript: for i in {0..$VARIABLE} do ... wertet $VARIABLE als String und nicht als Integ

Rain_Maker

Administrator
Teammitglied
Servus zusammen.

Disclaimer vorweg, das Problem an sich ist schon gelöst bzw. umgangen, mich interessiert nur, ob/wie das Ganze vielleicht doch mit einer "for"-Anweisung geht.

In einem kleinen Shellscript (bash), wird der Nutzer nach einer Zahl gefragt, wie oft das Script eine bestimmte Berechnung durchführen soll. Danach soll mit dieser (Ganz)zahl eben genau so oft eine Anweisung durchlaufen werden und das wollte ums Verrecken nicht mit der naheliegenden Idee einer for-Anweisung durchlaufen.

Hier etwas Pseudocode (der eigentliche Code im Script ist hier irrelevant, deshalb ein einfaches "echo"), der das Problem zeigen soll:

Code:
for i in {0..10} ; do echo $i ; done
ergibt das erwartete Ergebnis.

Code:
for i in {0..10} ; do echo $i ; done
0
1
2
3
4
5
6
7
8
9
10
Und nun kommt der große Pferdefuss:

Code:
read ANZAHL
10

for i in {0..$ANZAHL} ; do echo $i ; done
{0..10}
Wie man sieht, wird nicht durchgezählt, weil die Shell offensichtlich die Variable "ANZAHL" nicht als Ganzzahl (Integer), sondern als String auswertet.

Wer eine Idee/Erklärung hat, immer her damit, aber vorher noch für Querleser die Art und Weise, wie ich das Problem gelöst/umgangen habe, auch wieder als Pseudocode:

Code:
#!/bin/bash

echo -e "Anzahl angeben"

read ANZAHL

while [[ $ANZAHL -gt 0 ]] ; do
  echo $ANZAHL
  ANZAHL=$(expr $ANZAHL - 1)
done

exit 0
Greetz,

RM
 

Stop

New Member
Code:
~> ANZAHL=10
~> for i in $(eval echo {0..$ANZAHL}) ; do echo $i ; done
0
1
2
3
4
5
6
7
8
9
10
~>
Zuerst muss also die Variable substituiert werden (eval), danach funktioniert die Brace Expansion.

Etwas weniger komplex:
Code:
~> echo {0..$ANZAHL}
{0..10}
~> eval echo {0..$ANZAHL}
0 1 2 3 4 5 6 7 8 9 10
~>
 
Oben