Reputation: 953
I have a problem implementing a for loop. I get this error when I execute my script
test1.sh: 2: Syntax error: Bad for loop variable
I don't understand this error.
This is my script
#!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Welcome $c times..."
done
can any one tell me syntax for for loop in sh(in ubuntu it links to dash shell) shell in ubuntu?
Upvotes: 21
Views: 35128
Reputation: 107080
Your shell script (as shown) runs in both Korn shell and Bash. Some thoughts:
syntax error: '(' unexpected
instead).for ((x;y;z))
construct.Try this:
#! /bin/bash
set -vx
echo "Random = $RANDOM" #Test for bash/Kornshell. Will be blank in other shells
echo \$BASH_VERSINFO[0] = ${BASH_VERSINFO[0]} #Should only work in BASH
echo \$BASH_VERSINFO[1] = ${BASH_VERSINFO[1]}
echo \$BASH_VERSINFO[2] = ${BASH_VERSINFO[2]}
echo \$BASH_VERSINFO[3] = ${BASH_VERSINFO[3]}
echo \$BASH_VERSINFO[4] = ${BASH_VERSINFO[4]}
echo \$BASH_VERSINFO[5] = ${BASH_VERSINFO[5]}
for ((c=0, c<=5, c++))
do
echo "Welcome $c times"
done
set -xv
will display all lines as they are executed.$RANDOM
should display a value if this is either BASH or Kornshell (your for loop will work in either one).{$BASH_VERINFO[x]}
should only be set if this is truly BASH. These aren't even set even if you run Korn shell after you're in BASH (unlike $SHELL which will still contain bash
).If the for loop still gives you trouble, just delete it. Somewhere in this script, we'll find out if you're really executing a bash shell or not.
Upvotes: 1
Reputation: 58800
A standard POSIX shell only accepts the syntax for varname in list
The C-like for-loop syntax for (( expr1; expr2; expr3 ))
is a bashism.
You can get similar behavior in the standard POSIX shell using for c in $(seq 1 5)
Upvotes: 6
Reputation: 24768
What does
ls -l /bin/sh
give on your machine ?
Make sh
a symbolic link to bash
and then you can do sh ./test1.sh
Upvotes: 1
Reputation: 143249
You probably run it with sh
, not bash
. Try bash test1.sh
, or ./test1.sh
if it's executable, but not sh test1.sh
.
Upvotes: 38