Você pode usar o comando date
para analisar esses valores da seguinte forma:
adjusted_val="$(printf '%s' "$val" | sed 's/h/hour/')"
result="$(date -d "$(date -d @0) + $adjusted_val" +%s)"
Curiosamente, date
não reconhece h
(ou mesmo hr
)
como uma abreviação para "hora",
Portanto, como primeiro passo, substituímos h
na string por hour
.
Então encontramos “o tempo da época” -
a data / hora a partir da qual a data / hora do Unix é contada -
expandindo @0
(tempo Unix 0) como uma string.
(Este bem conhecido e documentado para ser "01 de janeiro de 1970 00:00:00 GMT",
então poderíamos codificar esse valor.)
Em seguida, adicionamos sua string: por exemplo, (1º de janeiro) + 3 dia (s) é 4 de janeiro.
Em seguida, usamos +%s
para exibir essa data / hora como data / hora numérica do Unix,
qual é o número de segundos após a época.
Isso corresponde ao valor do intervalo (delta) da sua string.
Se você quiser fazer muitos valores de uma só vez,
você pode otimizar isso computando a época apenas uma vez:
#!/bin/sh
epoch="$(date -d @0)"
for val
do
adjusted_val="$(printf '%s' "$val" | sed 's/h/hour/')"
if result="$(date -d "$epoch + $adjusted_val" +%s)"
then
printf '%-12s -> %6d\n' "$val" "$result"
else
printf '%-12s <- error\n' "$val"
fi
done
resultados:
$ ./myscript '3 day 18h' '3 day' '3h 15min' '3h' '15min 10sec' '15min ' \
'10sec' 'a moment' '3 weeks'
3 day 18h -> 324000
3 day -> 259200
3h 15min -> 11700
3h -> 10800
15min 10sec -> 910
15min -> 900
10sec -> 10
date: invalid date ‘Wed, Dec 31, 1969 7:00:00 PM + a moment’
a moment <- error
3 weeks -> 1814400
Observe que date -d
pode manipular a palavra "mês".
Se houver a possibilidade de você receber valores contendo essa palavra,
você precisará tornar o comando sed
mais inteligente,
por isso não muda o "h" em "mês".