2

该程序假设从用户那里接受一个数字并打印那么多素数。由于某种原因,该程序不起作用。我是 bash 脚本的新手,这是我的第一个程序。在我看来,一切似乎都是正确的。请告诉我哪里出错了。

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

这是我得到的输出

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
 .
 .
 .

进行建议的更改后

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

我能够运行该程序,但它没有产生任何结果

http://i.stack.imgur.com/Fd1se.png

4

4 回答 4

2

您需要在之后放置一个空格,[因为[它是一个应用程序。

而且你不能在括号之间进行计算。您需要告诉 bash 它需要计算这些值。因此,您需要将第 11 行更改为if (( i % j == 0 )).

于 2012-05-01T12:09:56.910 回答
1

if [i % j == 0];应该if [ i % j == 0 ];

与第 18 行的相同

于 2012-05-01T12:10:00.250 回答
0

就像其他人所说的那样,[程序在其参数之前需要一个空格,就像所有程序在其参数之前都需要一个空格一样。这就是为什么我更喜欢test内置的原因之一[,它的语法很笨拙,需要一个无用]的作为最后一个参数,只是为了让它看起来漂亮和理智。

if test $((i % j)) = 0; then
   break
fi
于 2012-05-01T12:51:22.280 回答
0
#!/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

更新,在意识到(感谢 Will Ness)之后,搜索到 INPUT 的所有素数。

我只需要跑到√(n)。

于 2012-05-02T09:18:23.683 回答