Search code examples
bashshellubuntuexpr

newprime.sh: line 14: [: 0+1: integer expression expected


what's wrong with my code? I am trying to print prime numbers upto n digits

 echo Enter Number
    read num
    for (( i=2; $i <= $num ; i++ ))
    do
            c=0
            for (( j=2; $j <= $i ; j++))
            do
                    mod=$(($i % $j))
                    if  [ "$mod" -eq 0 ]
                    then
                            c=`expr $c+1`
                    fi
            done
            if [ "$c" -eq 1 ]
            then
                    echo $c
    
            fi
    done

I don't have any idea what I'm doing wrong. If someone could tell me how to fix it I would be thankful

newprime.sh: line 14: [: 0+1: integer expression expected
newprime.sh: line 14: [: 0+1: integer expression expected
newprime.sh: line 14: [: 0+1+1: integer expression expected
newprime.sh: line 14: [: 0+1: integer expression expected
newprime.sh: line 14: [: 0+1+1+1: integer expression expected
newprime.sh: line 14: [: 0+1: integer expression expected

Solution

  • expr requires parameters to be passed as separate arguments. Quoting the POSIX standard for expr:

    The application shall ensure that each of the expression operator symbols [...] and the symbols integer and string in the table are provided as separate arguments to expr.

    The code here is appending all the operators into a single argument, hence your problem.


    Thus:

    c=$(expr "$c" + 1)
    

    ...NOT...

    c=$(expr $c+1)
    

    But don't do that at all. It's more efficient and more readable to write:

    c=$(( c + 1 ))