Команда date
не является частью bash.Он предоставляется вашей операционной системой, и его поведение отличается в разных операционных системах.В частности, дата ядра GNU coreutils (в большинстве дистрибутивов Linux) имеет опцию -d
, используемую для интерпретации исходных дат, тогда как дата BSD имеет опцию -f
для интерпретации специально отформатированных входных дат и опцию -v
для настройки времени различными единицами.
У вас уже есть принятый ответ для опции Linux.Чтобы закончить это, вот опция BSD (и macOS):
$ for (( s=0; s<86400; s+=610 )); do date -j -v+${s}S -f '%H:%M:%S' "$time" '+%T'; done | head -5
00:00:00
00:10:10
00:20:20
00:30:30
00:40:40
Вывод здесь явно урезан до 5 строк.
Конечно, это все еще зависит от платформы.Если вы хотите что-то, что будет работать с bash в любом месте , то, если вы используете bash> 4.2, может сработать следующее:
$ offset=$(printf '%(%z)T\n' 0)
$ for (( s=$(( ${offset:1:2}*3600 + ${offset:3}*60 )); s<86400; s+=610 )); do printf '%(%T)T\n' "$s"; done | head -5
00:00:00
00:10:10
00:20:20
00:30:30
00:40:40
Переменная $offset
позволяет намчтобы компенсировать тот факт, что вы не можете быть в UTC.:) Как и в случае решения date
, этот шаг выполняется с шагом 610 секунд, но для генерации вывода используется формат printf
%T
.Вы можете добавить или вычесть смещение часового пояса к конечной точке 86400, чтобы получить полный рабочий день.Обработка, которая оставлена как упражнение для читателя.: -)