在 shell 中格式化并显示带有小数秒的间隔

der*_*ert 4 shell-script

我有一个间隔,以秒为单位,带小数点,我想以人类可读的 (H:MM:SS.SSS) 格式显示。例如,16633.284 应显示为 4:37:13.284。所有这些时间都在 24 小时以内,但如果它们结束了,它仍然只是几个小时。

再举几个例子:

   0      ? 0:00:00.000
  60.394  ? 0:01:00.394
8944.77   ? 2:29:04.770
Run Code Online (Sandbox Code Playgroud)

请注意,它在 10 小时内是固定宽度的。当然,使用printf.

我发布了我的解决方案作为答案,但感觉必须有更好的方法来做到这一点,所以我问:其他方法是什么?我对 bashisms、zshisms 等方式持开放态度。

注意:这与将秒显示为天/小时/分钟/秒有关?但是这些方法都不起作用,因为 bash 中的算术仅是整数。

Sat*_*ura 7

小数部分对小时数、分钟数或秒数没有任何贡献,因此您可以简单地将其放在一边,在没有它的情况下进行计算,然后在最后将其添加回来。像这样的东西:

#!/bin/sh
seconds=16633.284
f=${seconds##*.}
if [ "$f" = "$seconds" ]; then f=0; fi
t=${seconds%.*}
s=$((t%60))
m=$((t/60%60))
h=$((t/60/60))
printf '%d:%02d:%06.3f\n' $h $m $s.$f
Run Code Online (Sandbox Code Playgroud)

输出:

   0     ? 0:00:00.000
  33.    ? 0:00:33.000
    .21  ? 0:00:00.210
  60.394 ? 0:01:00.394
8944.77  ? 2:29:04.770
Run Code Online (Sandbox Code Playgroud)

这适用于任何类似 sh 的 shell(除了一些古老的 POSIX 之前的 shell)。