我需要在变量中增加分钟和秒(与时间有关)。
首先,我不确定声明'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)天,但我不知道如何将此示例应用于时间(分钟和秒)而不是日期?
非常感谢所有回复。
答案 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终点以获得一整天的时间。处理这是留给读者的练习。 : - )