期望的整数表达式 - shell脚本

时间:2016-03-24 19:35:48

标签: shell scripting

源代码是:

#!/bin/bash

read nr

if [ $nr -le 2 ]
then
        echo " $nr is not prime"
else
        d=2
        while [ $d -le `expr $nr / 2 ` ] && [ `expr $d % $nr ` -ne 0 ]
        do
                d=$((d+1))
        done
        if [ $d -le `expr $nr/2 ` ]
        then
                echo " $nr is not prime"
        else
                echo " $nr is prime"
        fi
fi

例如,如果“nr”变量的值为6,则会出现错误:

./prim.sh: line 14: [: 6/2: integer expression expected

2 个答案:

答案 0 :(得分:0)

[ 2 -le 6/2 ] && echo yes

无效,但

[ 2 -le $(( 6/2 )) ] && echo yes

应。

答案 1 :(得分:0)

# the source of problem is that `expr $nr/2 ` is different of `expr $nr / 2 ` ( with space arround the "/" caracter):
# if nr=6
# `expr $nr/2 ` is a string "6/2"
# `expr $nr / 2 ` is 3

nr=6
echo `expr $nr/2 `
#6/2

echo `expr $nr / 2 `
#3

if [ $d -le `expr $nr/2 ` ]
# will compare an integer with a string 

# contrariwise, the following statement is ok :
if [ $d -le `expr $nr / 2` ]

关于模数还有另一个问题:($ nr%$ d)而不是($ d%$ nr)

更正:

#!/bin/bash

read nr

if [ $nr -le 2 ]
then
        echo "$nr is prime"
else
        d=2
        while [ $d -le `expr $nr / 2 ` ] && [ `expr $nr % $d ` -ne 0 ]
        do
                d=$((d+1))
        done
        if [ $d -le `expr $nr / 2` ]
        then
                echo "$nr is not prime"
        else
                echo "$nr is prime"
        fi
fi
done

检查

for nr in {1..12}; do 
d=2
if [ $nr -le 2 ]
then
        echo "$nr is prime"
else
        d=2
        while [ $d -le `expr $nr / 2 ` ] && [ `expr $nr % $d ` -ne 0 ]
        do
                d=$((d+1))
        done
        if [ $d -le `expr $nr / 2` ]
        then
                echo "$nr is not prime"
        else
                echo "$nr is prime"
        fi
fi
done

#1 is prime
#2 is prime
#3 is prime
#4 is not prime
#5 is prime
#6 is not prime
#7 is prime
#8 is not prime
#9 is not prime
#10 is not prime
#11 is prime
#12 is not prime