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

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

      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:

      Quellcode

      1. for i in {0..10} ; do echo $i ; done

      ergibt das erwartete Ergebnis.

      Quellcode

      1. for i in {0..10} ; do echo $i ; done
      2. 0
      3. 1
      4. 2
      5. 3
      6. 4
      7. 5
      8. 6
      9. 7
      10. 8
      11. 9
      12. 10

      Und nun kommt der große Pferdefuss:

      Quellcode

      1. read ANZAHL
      2. 10
      3. for i in {0..$ANZAHL} ; do echo $i ; done
      4. {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:

      Shell-Script

      1. #!/bin/bash
      2. echo -e "Anzahl angeben"
      3. read ANZAHL
      4. while [[ $ANZAHL -gt 0 ]] ; do
      5. echo $ANZAHL
      6. ANZAHL=$(expr $ANZAHL - 1)
      7. done
      8. exit 0


      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      Quellcode

      1. ~> ANZAHL=10
      2. ~> for i in $(eval echo {0..$ANZAHL}) ; do echo $i ; done
      3. 0
      4. 1
      5. 2
      6. 3
      7. 4
      8. 5
      9. 6
      10. 7
      11. 8
      12. 9
      13. 10
      14. ~>

      Zuerst muss also die Variable substituiert werden (eval), danach funktioniert die Brace Expansion.

      Etwas weniger komplex:

      Quellcode

      1. ~> echo {0..$ANZAHL}
      2. {0..10}
      3. ~> eval echo {0..$ANZAHL}
      4. 0 1 2 3 4 5 6 7 8 9 10
      5. ~>
      Feines Ding, Firma dankt.

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K