在bash脚本中创建时间戳变量


375

我正在尝试在shell脚本中创建一个timestamp变量,以使记录变得更加容易。我想在脚本的开头创建变量,并在每次发布时将其打印出当前时间echo $timestamp。事实证明,这比我想的要困难得多。这是我尝试过的一些方法:

timestamp="(date +"%T")" 回显打印 (date +"%T")

timestamp="$(date +"%T")" echo打印变量初始化的时间。

我尝试过的其他方法只是细微的变化,效果并不好。有谁知道我该怎么做?

Answers:


309

为了获得当前时间戳而不是定义固定变量的时间,技巧是使用函数而不是变量:

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T"
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

如果您不喜欢%T说明符给出的格式,则可以将接受的其他时间转换说明符组合在一起date。对于GNU date,您可以在以下官方文档中找到这些说明符的完整列表:https : //www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers


26
根据您打算如何使用它,您仍然需要使用命令替换:echo "$(timestamp): something happened"
chepner 2013年

5
至于格式设置,以下是最常用的格式集:zxq9.com/archives/795
zxq9 2014年

175
对于我来说,我想要 date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson

3
由于某种原因,这没有给我时间戳,但给了我当前时间,中间是“:”。
erikbwork

7
我认为很多人都在寻求这个问题,以寻求一种生成unix时间戳的方法(如我所知),并发现dchakarov的答案更有用,即使该答案更好地解决了问者的问题。
greatlysuperiorman

565

如果要获取unix时间戳,则需要使用:

timestamp=$(date +%s)

%T会给你时间 与%H:%M:%S(通过http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/)相同


5
但是此变量仅保留变量启动时的时间值,对吗?
lindhe 2014年

9
我猜这会得到很多支持,因为它回答了问题的标题,但没有回答问题正文:D OP每次都希望获得不同的时间戳,而这将为整个脚本存储一个时间戳。
fedorqui'SO停止伤害

1
我是来这里寻找的。即正确的格式字符串,以从中获取Unix时间戳date。但是,我也赞成“正确”的答案。我不是在找那个,但这是对原始问题的更好答案,对我也真的很有用。
大大超人

69
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too

1
谢谢,这就是我想要的:将时间戳记作为可在脚本中重用的变量!Shell语法是如此混乱。
Poutrathor

2
+1用于添加毫秒部分。这echo $(date +"%Y-%m-%dT%T.%3N%z") 可是我不能让它在一台Mac终端工作。如何在Mac中执行相同操作。谢谢
kosgeinsky

43

ISO 8601格式(2018-12-23T12:34:56)比UNIX时间戳更具可读性。但是,在某些操作系统:上,文件名不能包含。因此,我建议改用这样的方法:

2018-12-23_12-34-56

您可以使用以下命令以这种格式获取时间戳:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

这是我在许多应用程序中看到的格式。与此相关的另一个好处是,如果文件名以此开头,则可以按字母顺序对它们进行排序,并且可以按日期对它们进行排序。


1
谢谢,这对我的版本控制脚本非常
Andy

1
TZ=UTC date +...可以通过使用UTC时间戳使其更易于移植
MichaelChirico

17

我正在使用Ubuntu 14.04。

在我的系统中正确的方法应该是date +%s

的输出date +%T12:25:25


15

使用命令替换:

timestamp=$( date +%T )

3
这是我已经尝试过的方法,它只打印出初始化变量的时间。
2013年

10
@ dan08:这就是变量的工作方式。如果要动态输出,请使用一个函数。
choroba 2013年

11

您可以使用

timestamp=`date --rfc-3339=seconds`

以以下格式提供 2014-02-01 15:12:35-05:00

反引号(`)字符将导致对它们之间的内容进行评估,并将结果包括在该行中。 date --help还有其他选择。


1
至于什么时间,应该在包含在屏幕输出或打算列出输出时间的日志文件中之前立即执行。
比尔

2
由于输出空间有限,因此它不适合时间戳的理想格式。请务必在使用中引用它“ $ timestamp”,否则该命令将有两个参数。例如touch $timestamp将产生两个文件。
harschware '17

8

最新版本的bash不需要调用外部程序date

printf -v timestamp '%(%T)T'

%(...)T使用相应的参数作为UNIX时间戳,并根据strftime括号之间的-style格式对其进行格式化。参数-1对应于当前时间,并且在没有歧义的情况下可以省略。


5

对于我的欧洲同胞,请尝试使用此方法:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

将给出以下格式的格式:“ 15-02-2020_19-21-58”

您调用变量并获得像这样的字符串表示形式

$timestamp

1
请考虑为您的代码使用代码符号。

4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

没有值的srand在大多数Awk实现中使用当前时间戳。


我喜欢这个,很有创意!
TobiV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.