Время увеличения (минуты и секунды) в скрипте bash / shell - PullRequest
6 голосов
/ 22 октября 2010

Мне нужно увеличить минуты и секунды (по отношению к времени) в переменной.

Во-первых, я не уверен, записано ли объявление переменной 'time' как

time="00:00:00" 

или

 time=$(date +00:00:00)?

Оттуда я хочу увеличить эту переменную на 10 минут и секунд, в результате чего

01: 00: 00 увеличится до
01:10:10 до
01: 20: 20 и т. Д. (Вплоть до полуночи - 00:00:00)

Каков наилучший способ достичь этого?

Я понимаю, что делать $ date -d "2010-07-07 200 days" добавляет (200) дней, но я не знаю, как применить этот пример ко времени (минуты и секунды), а не к дате?

Все ответы очень ценятся.

Ответы [ 2 ]

5 голосов
/ 22 октября 2010

Обратите внимание, что это только Linux. date -d в Unix-системах BSD (и, возможно, в других) делает что-то значительно другое (и неблагоприятное). Вы можете использовать время эпохи, т. Е. Секунды с 1 января 1970 г. 00:00:00, например:

#!/bin/bash

time=0
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
time=$((time + 600))
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
time=$((time + 600))
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`

дает этот вывод:

$ /tmp/datetest.sh
00:00:00
00:10:00
00:20:00
$
0 голосов
/ 18 января 2018

Команда 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, чтобы получить полный рабочий день.Обработка, которая оставлена ​​как упражнение для читателя.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...