这是上一个关于我编写的脚本的问题的后续问题,bash
以帮助我更准确地跟踪我的恶习。我现在正在尝试修改脚本以显示所有非零单位:
It's been 2 weeks, 1 day and 5 hours since you last bought a deck.
为此,这里是我到目前为止脚本的相关部分:
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
这在几个小时和几天内都可以正常工作(运行带有-b 50
shows小时值的脚本2 days and 2 hours
)。但是,当在脚本中输入至少一周的小时值时,会填充 和变量。这意味着对于(以小时为单位的 1 周)的值,输出将是:$W
$D
-b 168
It's been 1 weeks and 7 days since you last bought a deck.
我怎样才能解决这个问题,最好同时实现这样的单一时间段:
It's been 1 week and 1 hour since you last bought a deck.
我也知道我可能会以一种非常粗略的方式检查我的逻辑,所以如果有更聪明/更常见的方法可以做到这一点,我将不胜感激,并且
乍一看,我认为问题在于您正在使用完整的经过时间评估 W、D、H。
每次评估后,您应该减少
elapsed
该数量。日期和时间似乎没有递减的情况很可能是因为 H 是使用模 24 评估的。
还要记住,由于闰年、月份、夏令时、日历翻转等,日期操作更加复杂。
从片段和明显的使用来看,数学可能已经足够好了。
经过大量的试验和错误并查找了非常令人困惑的变量运算符(等)的文档后,我设法调整了 Glenn 的答案以使其对我有用:
bash
=/
=*
我仍然不完全确定我理解变量运算符是如何工作的,但无论哪种方式,代码现在似乎都按我想要的方式工作。