Roger That
Roger That

Reputation: 65

Bash script error: [i: command not found

This program is suppose to accept a number from the user and print that many prime numbers. For some reason the program doesn't work. I am new to bash scripting and this is my first program. To my eyes everything seems to be correct. Please tell me where I went wrong.

echo Enter num
read n
i=2
j=2

for(( i=2; i <= n; i++ ))
do

for(( j=2; j < i-1; j++ ))
do

if [i % j == 0];
then
break
fi


if [i == j];
then
echo "  $i"
fi
done
done

This is the output I get

Enter num
20
prime.sh: line 12: [i: command not found
prime.sh: line 18: [i: command not found
prime.sh: line 12: [i: command not found
prime.sh: line 18: [i: command not found
 .
 .
 .

After making the suggested changes

read -p "Enter a  number : " n
i=2
j=2
for(( i=2; i <= n; i++ ))
do
    for(( j=2; j <= i-1; j++ ))
    do
        if [ $(( i % j )) == 0 ]
        then
            break
        fi
        if [ i == j ]
        then
            echo "  $i"
        fi
    done
done

I was able to run the program but it didn't produce any result

https://i.sstatic.net/Fd1se.png

Upvotes: 2

Views: 3195

Answers (4)

user unknown
user unknown

Reputation: 36229

#!/bin/bash
#
# primes
#
read -p "Enter a  number: " n
i=2

for (( i=2; i <= n; i++ ))
do
    for (( j=2; j*j < i; j++ ))
    do
        if ((i % j == 0))
        then
            echo "no prime, $i divider: "$j
            break
        fi
    done
done

updated, after realizing (thanks Will Ness), that all primes up to INPUT are searched.

i needs to run to √(n) only.

Upvotes: 0

DipSwitch
DipSwitch

Reputation: 5640

You need to place a space after the [ because [ is an application.

And you can't make calculations between the brackets. You will need to tell bash it needs to calculate the values. So you would need to change line 11 to if (( i % j == 0 )).

Upvotes: 2

Jens
Jens

Reputation: 72639

Like the others have said, the [ program needs a space before its parameters, like all programs need a space before their args. This is one reason why I prefer the test builtin to [ with its kludgy syntax requiring a useless ] as the last arg just to make it look pretty and sane.

if test $((i % j)) = 0; then
   break
fi

Upvotes: 0

Sionide21
Sionide21

Reputation: 2211

if [i % j == 0]; Should be if [ i % j == 0 ];

Same for the one on line 18

Upvotes: 1

Related Questions