То, что вы просите, - это трудность грани невозможного с использованием чистого bash. Bash не имеет собственных функций даты. Для обработки даты большинство рекомендаций, которые вы получите, будет использовать команду date
вашей операционной системы, но использование этой команды зависит от операционной системы.
В BSD (включая macOS):
start="2019-01-05 23:52:00"; end="2019-01-06 00:02:10"
printf '%d\n' $(( $(date -j -f '%F %T' "$end" '+%s') - $(date -j -f '%F %T' "$start" '+%s') ))
В Linux или что-либо, использующее дату GNU (возможно, также Cygwin):
printf '%d\n' $(( $(date -d "$end" '+%s') - $(date -d "$start" '+%s') ))
И просто для удовольствия, если вы не можете (или предпочли бы не использовать) по какой-то причине date
, возможно, вам удастся избежать неприятностей с gawk:
gawk 'END{ print mktime(gensub(/[^0-9]/," ","g",end)) - mktime(gensub(/[^0-9]/," ","g",start)) }' start="$start" end="$end" /dev/null
Опция mktime()
анализирует строку даты практически в том формате, который вы предоставляете, что упрощает математику.