Я вижу несколько проблем.
- Я не распознаю синтаксис
$[...]
и не могу найти оболочку, которая его распознает (см. Комментарии ниже, где пользователь @KamilCuk объясняет это далее). - Синтаксис
if
неправильный, возможно, он заменен предыдущей строкой. - Из-за скобок то, что читается как знак «меньше» (
<
) собирается попытаться перенаправить ввод в программу. - Ответ всегда будет распечатан.
- Как вы заметили, нет никаких шансов, что юлианский день будет работать с разными годами.
Попробуйте вместо этого что-нибудь вроде этого.
#!/bin/sh
Сначала разделите даты для облегчения отладки, а также используйте `+% s, чтобы получить« UNIX время »секунд с момента начало 1970 года.
now=$(date +%s $now)
target=$(date +%s -d $1)
days=$(($target - $now));
Исправьте условный синтаксис.
if [ $days -lt 0 ]
then
echo error
exit 1
Поместите вывод в предложение else
.
else
Поскольку у нас есть ответ в секундах, разделите на количество секунд в обычном дне.
days=$(($days / 86400))
echo "There are $days days left to this date."
fi
Я также убрал echo
syn налог для ясности.
Обратите внимание, что это все еще не идеально . В зависимости от вашего определения «один день» будут случаи, когда ответ этого сценария будет отличаться от того, что вы хотите; в этом случае вам нужно настроить $target
в соответствии с определенным временем суток. Кроме того, не каждый день длится 86400 секунд из-за летнего времени и дополнительных секунд . Но с этими оговорками, он должен работать достаточно хорошо, и добавление их в сценарий звучит как больше работы, чем «сколько дней?» должен гарантировать.
Если вы хотите увидеть шаги, которые предпринимаются для отладки, запустите его с помощью sh -x date.sh '2022-12-31'
(с именем и датой вашего скрипта), поскольку аргумент -x
указывает оболочке дать вам трассировка »промежуточных шагов.