Bash中的Easter计算产生恒定结果

时间:2019-06-05 13:51:48

标签: linux bash

所以基本上我的复活节计算器遇到了这个问题,它是我在shellcheck上检查过的bash脚本,但是运气很小甚至没有运气,这是代码:

#!/shell/bash

read -r -p year
Am19=$((year% 19))
m19=$((19*(Am19)))
Am4=$((year%7))
m4=$((19*(Am4)))
Am2=$((year%4))
m2=$((2*(Am2)))
Av2=$((16+(m19)))
v2=$((Av2%30))
Av1=$((6*(v2)+m4+m2))
v1=$((Av1%7))
p=$((v1+v2))
echo "$p"

一切似乎都很好,但是每次我输入数字时,结果总是21 我找不到任何问题,我们将不胜感激。

1 个答案:

答案 0 :(得分:5)

非常有趣的问题,尤其是因为shellcheck并未指出问题。问题出在第一行

 read -r -p year

这里year不是变量名,而是给-p的提示(要打印的文字字符串)。来自help read(简化版):

  

read [-r] [-p prompt] [name ...]
  如果未提供任何名称,则将读取的行存储在REPLY变量中。

用户输入的字符串存储在变量REPLY中,而不存储在year中。变量year保持不变,并且在诸如0之类的算术上下文中将扩展为((…))

使用read -r -p year year来解决问题,甚至更好

read -r -p 'enter a year: ' year

进一步的改进

  • #! /shell/bash真的正确吗?我从未听说过使用这种路径的系统。我希望有/bin/bash

  • 您可以在((…))内进行分配,不需要子shell。写((a=b+c))而不是a=$((b+c))

相关问题