Расчет дней, оставшихся до указанной c даты - PullRequest
1 голос
/ 08 мая 2020

Мне сложно найти способ подсчитать количество дней, оставшихся до указанной c даты (переданной в качестве аргумента). Я пробовал это, но он даже не работает правильно с любой датой 2021 года.

days=$[$(date +%j -d $1)-$(date +%j $now)];
if (( $days < 0 ))
then
        echo "error";
        exit 1;
fi

echo "Theres" $days "left to this date.";

Кто-нибудь знает, как я могу это исправить?

1 Ответ

1 голос
/ 08 мая 2020

Я вижу несколько проблем.

  • Я не распознаю синтаксис $[...] и не могу найти оболочку, которая его распознает (см. Комментарии ниже, где пользователь @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 указывает оболочке дать вам трассировка »промежуточных шагов.

...