需要整数表达式-shell脚本

需要整数表达式-shell脚本,shell,scripting,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

源代码是:

#!/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 -le $(( 6/2 )) ] && echo yes
应该

# 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)

更正: 检查 如果您使用的是
$(…)
,则根本不需要使用
expr
<代码>表达式相对来说比较笨拙。通常使用
$(…)
比使用反勾号更好。你也可以阅读内置的
[
——我不喜欢它,但我很古怪,很古老(这冒犯了我对符号一致性的古老感觉)。
# 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` ]
#!/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