首页 > 解决方案 > 依次列出数字 1-1000 的 Bash 脚本,赔率是黄色,偶数是绿色,素数是蓝色

问题描述

显然这是一个课堂作业。我已经玩了几天了。我很容易让奇数和偶数方面工作得很好,但我一直遇到素数问题。

这是奇数/偶数并且有效

  #!/bin/bash
  for i in $(seq 1000)
  do
    if (($i % 2));then  #even
        echo -e "\e[32m$i\e[0m"  #green

    else  #odd
        echo -e "\e[33m$i\e[0m"  #yellow

    fi
  done

这是奇数/偶数/素数,我无法让它工作。

  #!/bin/bash
  for i in $(seq 1000)
  do
    if (($i % 2));then  #even
            if
                    ($i -eq factor {2..1000})
                            echo -e "\e[34m$i\e[0m" #blue
            else
                    echo -e "\e[32m$i\e[0m"  #green
            fi
    else  #odd
            if
                    ($i -eq factor {2..1000})
                            echo -e "\e[34m$i\e[0m" #blue
            else
                    echo -e "\e[33m$i\e[0m"  #yellow
            fi
    fi
  done

这只是我最近的尝试。我尝试了几种不同的方法并且没有工作。一点帮助将不胜感激。也许我做错了,也许我很接近,但我花了很多时间研究这个,似乎永远无法将它应用到我的脚本中。

标签: linuxbashshellscriptingprimes

解决方案


这很简单。

# from https://stackoverflow.com/questions/45392068/check-if-a-number-is-a-prime-in-bash
isPrime() {
    if (( $1 == 2 || $1 == 3 )); then
        return 0  # prime
    fi
    if (( $1 % 2 == 0 || $1 % 3 == 0 )); then
        return 1  # not a prime
    fi
    local i w
    i=5
    w=2
    while (( i * i <= $1 )); do
        if (( $1 % i == 0 )); then
            return 1  # not a prime
        fi
        i=$((i + w))
        w=$((6 - w))
    done
    return 0  # prime
}

isEven() {
    (( $1 % 2 == 0 ))
}


seq 1000 |
while IFS= read -r n; do
   if isPrime "$n"; then
       echo blue "$n"
   elif isEven "$n"; then
       echo green "$n"
   else
       echo yellow "$n"
   fi
done

isPrime函数只是从这个线程中复制的,这是谷歌搜索的第一个结果bash how to check for prime number。修复了它的返回值,所以如果一个数字是素数,它返回 0(成功),如果一个数字不是素数,它返回非零,并改为只使用 arimetic 扩展。

由于 OP 了解如何使用转义序列在终端上打印彩色输出,因此我只是做了简单的回显以提高可读性。

@edit 修正了 isPrime 函数 /while/s/==/<=/
@edit 中的一个错字,当然 isEven 函数应该被颠倒......


推荐阅读