De ce această buclă de tip „for loop” care se incrementează returnează o variabilă rea? (Unix, Bash, Dash, Ash, Pentru)

dericke a intrebat.

Încerc să apelez acest script shell din cadrul CLI al GRASS GIS:

for (( day=5; day<367; day+5 )); do
  # commands that I've tested without a loop.
done
exit 0

returnează

Syntax error: Bad for loop variable

Comentarii

  • try day+=5 Mult noroc. –  > Por shellter.
2 răspunsuri
Bruce Ediger

Poate că GRASS GIS predefine o variabilă numită „day”?

Apropo, codul nu funcționează în bash direct. De fapt, nu incrementezi valoarea lui „day”.

#!/bin/bash
for (( day=5; day<367; day=day+5 )); do
  # commands that I've tested without a loop.
        echo $day
done
exit 0

Asta funcționează pentru mine, bash 2.05b pe un server RHEL 5.0.

Comentarii

  • De asemenea, se poate folosi day+=5 –  > Por glenn jackman.
  • OT: @glenn jackman bash 2.05b? Aceasta este o versiune din 2003. Oricum, snipletul funcționează și pe 4.2. –  > Por jippie.
  • Se pare că problema ar fi putut fi utilizarea #!/bin/sh în partea de sus a scriptului, ca în exemplele de pe GRASS wiki, în loc de #!/bin/bash. Asta, și folosind day+=5, rezolvă problema. –  > Por dericke.
Gilles „SO- nu mai fi rău

Acest mesaj de eroare provine de la ash. Există mai multe shell-uri cu o sintaxă similară. Ash este unul relativ de bază, conceput pentru o amprentă de memorie mică și o execuție rapidă. Un alt shell comun este Bash. Bash are mai multe caracteristici. Sintaxa pe care ați postat-o există doar în Bash (și în alte câteva shell-uri, dar nu și în Ash).

În ash, ar trebui să scrieți¹:

day=5
while [ $day -lt 367 ]; do
  …
  day=$((day + 5))
done

Rețineți că, în funcție de distribuția Linux, /bin/sh este fie ash, fie bash (câteva exotice pot folosi alte implementări). Dacă scrieți un script care utilizează sintaxa bash, asigurați-vă că puneți #!/bin/bash în partea de sus.

¹ Presupunând că ați vrut să spuneți day+=5 unde ați scris day+5, , altfel este o buclă infinită.

Comentarii

  • Pentru acest caz, am decis să rămân la soluția bash dată de Bruce, dar răspunsul tău a fost, de asemenea, foarte util. Amândoi ați descoperit confuzia mea ash/Bash. –  > Por dericke.