Пасхальный расчет в Баше дает постоянный результат - PullRequest
1 голос
/ 05 июня 2019

Так что в основном у меня есть эта проблема с моим пасхальным калькулятором, это скрипт bash, который я проверил на shellcheck, но без особой удачи, это код:

#!/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 Ответ

5 голосов
/ 05 июня 2019

Очень интересная проблема, тем более что 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.

  • Вы можете выполнять назначения внутри ((…)), не требуя подоболочки. Напишите ((a=b+c)) вместо a=$((b+c)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...