Why does this incrementing for loop return a bad variable?

5,678

Solution 1

Perhaps GRASS GIS pre-defines a variable named "day"?

The code doesn't work in straight bash by the way. You don't actually increment the value of "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

That works for me, bash 2.05b on a RHEL 5.0 server.

Solution 2

This error message comes from ash. There are several shells with a similar syntax. Ash is a relatively basic one designed for a small memory footprint and fast execution. Another common shell is Bash. Bash has more features. The syntax you posted exist only in bash (and some other shells, but not ash).

In ash, you would need to write¹:

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

Note that depending on the Linux distribution, /bin/sh is either ash or bash (a few exotic ones may use other implementations). If you're writing a script that uses bash syntax, be sure to put #!/bin/bash at the top.

¹ Assuming you meant day+=5 where you wrote day+5, otherwise it's an infinite loop.

Share:
5,678

Related videos on Youtube

nffdiogosilva
Author by

nffdiogosilva

Updated on September 18, 2022

Comments

  • nffdiogosilva
    nffdiogosilva over 1 year

    I'm trying to call this shell script from within the CLI of GRASS GIS:

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

    returns

    Syntax error: Bad for loop variable
    
    • XGouchet
      XGouchet about 12 years
      try day+=5 Good luck.
  • Angel Todorov
    Angel Todorov about 12 years
    can also use day+=5
  • jippie
    jippie about 12 years
    OT: @glenn jackman bash 2.05b? That is a release from 2003. Anyways the sniplet does work on 4.2 too.
  • nffdiogosilva
    nffdiogosilva about 12 years
    It looks like the problem may have been using #!/bin/sh at the top of the script, as in the examples on the GRASS wiki, rather than #!/bin/bash. That, and using day+=5, does it.
  • nffdiogosilva
    nffdiogosilva about 12 years
    For this case, I decided to stick with the bash solution given by Bruce, but your answer was also very helpful. Both of you caught my ash/Bash mixup.