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

Fil*_*los 1 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"
Run Code Online (Sandbox Code Playgroud)

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

Soc*_*owi 5

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

 read -r -p year
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

进一步改进

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

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