Bash4またはksh93を使用している場合は、printf %()T
構文を使用してstrftime
フォーマットを印刷できます。次の例は、必要な形式でのBash4印刷です。バッシュの精度は1秒に制限されています。ksh93はfloatをサポートしており、いくつかの変更が必要になります。
#!/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)は、限られた範囲でそれを行うことができます。