【问题标题】:Finding smallest prime factor in bash shell script在 bash shell 脚本中找到最小的素数
【发布时间】:2019-07-10 06:00:10
【问题描述】:

这就是我想要完成的:

编写一个 Bash shell 脚本 factor.sh,它将执行以下操作: 1) 它提示用户输入一个从 10 到 100 的整数 n; 2)找到该数的最小(质)因数,因此如果该数是 21,它将输出消息“最小因数是 3”。如果数字是 77,它将输出“最小因数是 7”。 3) 如果这个数除了自己没有其他因数,应该输出“This number is prime”。

这是我目前的代码,但我不断收到错误。

echo "Enter a number from 10 to 100: "
read num
if (($num >= 10 && $num <= 100 ));
        then
                for ((i = 2; i <= $num; i++));do
                        if (($num % $i == 0));
                                then
                                        prime = $i
                                        break
                        fi
                done
                if (($prime == $num));
                        then
                                echo "This number is prime."
                else
                        echo "The smallest prime fatcor is: "
                        echo $prime
                fi
fi

我得到的错误是 prime = $i 的“第 16 行: =: command not found”

并且“第 20 行:((: == 77: 语法错误:操作数预期(错误标记是“== 77”)”,其中 77 将是我输入的数字,并且在线 if (($prime == $num));

我不确定我在这里做错了什么。任何帮助将不胜感激。

【问题讨论】:

  • 首先,在 shell 中,空格很重要。将prime = $i 替换为prime=$i
  • 其次,每当您遇到 shell 脚本错误时,最好的第一步是将您的代码剪切并粘贴到 shellcheck.net 并更正它识别的错误(重要)和警告(可能很重要) .如果您无法理解它的信息,请来这里询问。
  • @John1024 太好了,谢谢。这很有帮助,我将来肯定会使用它。非常感谢!
  • @Ash:在$num 之前你不需要循环。如果i 大于$num 的平方根,则$num 必须是素数。

标签: bash shell unix


【解决方案1】:

请检查以下已删除错误的脚本。

更正: 个空格已删除 prime=$i

echo "Enter a number from 10 to 100: "
read num
if (($num >= 10 && $num <= 100 ));
        then
                for ((i = 2; i <= $num; i++));do
                        if (($num % $i == 0));
                                then
                                        prime=$i
                                        break
                        fi
                done
                if (($prime == $num));
                        then
                                echo "This number is prime."
                else
                        echo "The smallest prime fatcor is: "
                        echo $prime
                fi
fi

【讨论】:

    【解决方案2】:

    大概这是一个bash 编程练习,但如果不是并且the factor util 可用,那么它很简单:

    spf() { factor "$@" | 
            while IFS=" :" read n f g ; do
                [ "$f" = "$n" ] && \
                echo "$f is prime." || \
                echo "The smallest factor of $n is $f." ;
            done ; }
    spf 53 534
    

    输出:

    53 is prime.
    The smallest factor of 534 is 2.
    

    由于factor 接受来自STDIN 的输入,因此管道spf 也可以使用数字列表,例如

    seq 11 2 100 | spf
    

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 2018-02-23
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多