在bash / shell脚本中增加时间(分钟和秒)

时间:2010-10-21 20:56:46

标签: bash time shell

我需要在变量中增加分钟和秒(与时间有关)。

首先,我不确定声明'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 个答案:

答案 0 :(得分:5)

请注意,这只是Linux。关于BSD unix(以及可能还有其他人)的date -d做了一些显着不同的事情(并且不尽如人意)。

您可以使用纪元时间 - 即自1970年1月1日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
$

答案 1 :(得分:0)

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&gt; 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的{​​{1}}格式生成输出。您可以将时区偏移量添加或减去86400终点以获得一整天的时间。处理这是留给读者的练习。 : - )