如果你有 Bash4 或 ksh93,你可以使用printf %()T
语法来打印strftime
格式。以下示例是以您想要的格式打印的 Bash 4。Bash 精度限制为 1 秒。ksh93 支持浮点数并且需要一些修改。
#!/usr/bin/env bash
# To supply a default date/time. To use now as the default, leave empty, or run with a null first arg.
deftime='Fri Apr 14 14:00:00 EDT 2011'
if (( ${BASH_VERSINFO[0]}${BASH_VERSINFO[1]} >= 42 )); then
unixTime() {
printf ${2+-v "$2"} '%(%s)T' -1
}
else
unixTime() {
printf ${2+-v "$2"} "$(date '+%s')"
}
fi
stopWatch() {
local timestamp="$(date ${1:+'-d' "$1"} '+%s')" curtime day=$((60*60*24)) hour=$((60**2))
# unixTime -1 timestamp
while
unixTime -1 curtime
(( curtime -= timestamp ))
printf '%02dd:%02dh:%02dm:%02ds\r' $(( curtime / day )) $(( (curtime / hour) % 24 )) $(( (curtime / 60) % 60 )) $(( curtime % 60 ))
do sleep 1
done
}
stopWatch "${1-deftime}"
您可能还对$SECONDS
变量感兴趣。不幸的是,没有方便的方法来接受您想要的人类可读的日期。这将需要大量的解析工作。date 命令(尤其是 GNU date)可以在有限的范围内做到这一点。