2010-10-21 256 views
6

我需要在变量中增加分钟和秒(与时间相关)。在bash/shell脚本中增加时间(分钟和秒)

首先,我不知道是否宣告“时间”变量被写成

time="00:00:00" 

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

从那里,我想了10分钟和秒来增加这个变量导致

01:00:00增加到
01:10:10到
01:20:20 etc(一直到午夜 - 00:00:00)

什么是最好的方法为了达成这个?

据我所知,做 $ date -d "2010-07-07 200 days"增加(200)天,但我不知道如何将这个例子应用到时间(分钟和秒),而不是日期?

非常感谢所有的答复。

+0

你应该澄清你的目标和约束,特别是如果这是一个家庭作业问题(如果是的话,它应该被标记为这样)。在循环中多次运行诸如'date'等外部可执行文件可能会非常缓慢,但可能会大大简化代码。如果你需要提高性能,你需要编写一些更复杂的代码,并进行增量,模数和携带。 Bash没有“时间变量”的概念。如果你使用'date',你需要使用它理解的东西(可能是你的第一个例子)。否则,你将不得不使用Bash的字符串和整数。 – 2010-10-22 00:44:04

回答

5

请注意,这仅限于Linux。在BSD unixes(可能还有其他)上做了一些明显不同的事情(和不幸的事情)。

你可以使用划时代的时间 - 即秒自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

您可能需要将'-u'添加到date命令。 – 2010-10-22 00:37:35

+0

'+“%H:%M:%S”'相当于'%T' afair – 2014-03-12 09:48:24

+0

唉,'date'的'-d'选项与BSD unices和macOS中的意图完全不同。这个解决方案是Linux专用的,即使问题不是。 – ghoti 2018-01-17 03:26:03

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> 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终点上添加或减去时区偏移量以获得一整天的时间。处理这是留给读者的一个练习。 :-)

相关问题