Esta é uma pergunta de acompanhamento de uma pergunta anterior sobre um bash
script que escrevi para me ajudar a acompanhar com mais precisão meus vícios. Agora estou tentando modificar o script para exibir todas as unidades diferentes de zero:
It's been 2 weeks, 1 day and 5 hours since you last bought a deck.
Para esse fim, aqui estão as partes relevantes do script que tenho até agora:
last_bought=$(cat "$lb_file") # file contains time in epoch seconds
...
now=$(date -u +%s)
elapsed="$((now-last_bought))"
W=$((elapsed/60/60/24/7))
D=$((elapsed/60/60/24))
H=$((elapsed/60/60%24))
if [[ $W -le 0 && $D -le 0 && $H -gt 0 ]]; then string="$H hours"
elif [[ $W -le 0 && $D -gt 0 && $H -gt 0 ]]; then string="$D days and $H hours"
elif [[ $W -gt 0 && $D -gt 0 && $H -le 0 ]]; then string="$W weeks and $D days"
elif [[ $W -gt 0 && $D -le 0 && $H -gt 0 ]]; then string="$W weeks and $H hours"
elif [[ $W -gt 0 && $D -gt 0 && $H -gt 0 ]]; then string="$W weeks, $D days and $H hours"
fi
Isso funciona perfeitamente por horas e dias (executando o script com um valor de horas de -b 50
shows 2 days and 2 hours
). No entanto, quando um valor de hora é inserido no script com pelo menos uma semana, as variáveis $W
e $D
são preenchidas. Isso significa que para um valor de -b 168
(1 semana em horas), a saída será:
It's been 1 weeks and 7 days since you last bought a deck.
Como posso corrigir isso, de preferência ao implementar períodos de tempo singulares como:
It's been 1 week and 1 hour since you last bought a deck.
Também estou ciente de que provavelmente estou verificando minha lógica de maneira muito grosseira, então, se houver uma maneira mais inteligente / mais comum de fazer isso, gostaria de ser esclarecido e
À primeira vista, acho que o problema é que você está avaliando W,D,H usando todo o tempo decorrido.
Após cada avaliação, você deve decrementar
elapsed
nesse valor.O caso em que dia e hora parecem funcionar sem decrementar é mais provável porque H é avaliado usando o módulo 24.
Lembre-se também de que as operações de data são mais complexas devido a anos bissextos, meses, horário de verão, rollover de calendário etc. etc.
A partir do trecho e uso aparente, a matemática provavelmente é boa o suficiente.
Depois de muitas tentativas e erros e procurando a documentação dos
bash
operadores de variáveis muito confusos (=/
,=*
e similares), consegui adaptar a resposta de Glenn o suficiente para fazê-la funcionar para mim:Ainda não tenho certeza se entendi como os operadores de variáveis funcionam, mas de qualquer forma o código agora parece estar funcionando como eu queria.