linux - 依次列出数字 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
这只是我最近的尝试。我尝试了几种不同的方法并且没有工作。一点帮助将不胜感激。也许我做错了,也许我很接近,但我花了很多时间研究这个,似乎永远无法将它应用到我的脚本中。
解决方案
这很简单。
# 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 函数应该被颠倒......
推荐阅读
- html - 输入字段正则表达式模式阻止最后 3 个字符为:小写、大写、大写?
- php - Stripe API 和 PHP:PAYOUTS 与付款意图/费用的关系
- spring-boot - 在drools中只触发一组规则
- r - R:“z”必须是数字矩阵
- java - 在 Java 中不使用 JFrame 在窗口 10 屏幕上呈现文本
- docusignapi - 无法收到来自 DocuSign 的电子邮件发送失败的回电
- django - 在 Django 中,每个用户都有一个不同模型的 unqiue 计数器
- vue.js - 在 Vue JS 中忽略父级调用组件的子级
- reactjs - 类型 Element[] 不能分配给 react-bootstrap-typeahead 中的类型 never[]
- reactjs - 应用加载时最初无法调度操作