Angus
Angus

Reputation: 12621

Syntax error near unexpected token `if' in shell scripting

I was trying a sample program, to check the odd and even no's and was getting an error as below,

#!/bin/bash
N=10

for i in 1..N
if [$i/2 == 0]
then
        echo "even"
else
        echo "Odd"
fi

Error:

./case.sh: line 5: syntax error near unexpected token `if'
./case.sh: line 5: `if [$i/2 == 0]'

EDITED :

#!/bin/bash
N=10

for i in 1..N
do
if(( ($i/2) == 0 ));
then
        echo "even"
else
        echo "Odd"
fi
done

error :

./case.sh: line 6: ((: (1..N/2) == 0 : syntax error: invalid arithmetic operator (error token is "..N/2) == 0 ")
Odd

Correct working code :

#!/bin/bash
N=3

for (( i=1; i <= N; i++ ));
#for i in 1..N; // This didnt work
do
if [[ $i/2 -eq 0 ]]
#if (( i/2 == 0 ));     // This also worked
then
        echo "even"
else
        echo "Odd"
fi
done

Upvotes: 0

Views: 2397

Answers (2)

konsolebox
konsolebox

Reputation: 75478

[ ] or [[ ]] needs spaces between its arguments. And in your case you should use [[ ]] or (( )) as [ ] can't handle division along with comparison:

if [[ 'i / 2' -eq 0 ]]; then
if (( (i / 2) == 0 )); then

for i in 1..N; do should also be

for (( i = 1; i <= N; ++i )); do

You probably meant to have a form of brace expansion, but you can't apply a parameter name on it:

{1..10}  ## This will work.
{1..N}   ## This will not work.

Using eval may fix it but better go for the other form of for loop instead.

Upvotes: 1

Ashish Gaur
Ashish Gaur

Reputation: 2050

Try this :

#!/bin/bash
N=10

for i in $(seq 1 $N); do
if [ `expr $i % 2` -eq 0 ]
then
        echo "even"
else
        echo "Odd"
fi
done

1..N is not a valid syntax in bash(though I think you might be coming from ruby background), you can use seq.

Upvotes: 1

Related Questions