我试图在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并让它在发出echo $timestamp时打印出当前时间。事实证明这比我想象的要困难得多。以下是我尝试过的一些方法:

timestamp="(date +"%T")"回显输出(date +"%T")

timestamp="$(date +"%T")"回显变量初始化的时间。

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


当前回答

如果你想获取unix时间戳,那么你需要使用:

timestamp=$(date +%s)

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

其他回答

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

2018-12-23_12-34-56

您可以使用以下命令来获取该格式的时间戳:

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

这是我看到许多应用程序使用的格式。另一个好处是,如果你的文件名以这个开头,你可以按字母顺序排序它们会按日期排序。

避免叉! !

必须为每一行日志运行日期是多余的!!

尽可能使用bash的内置。

更新2023

在提出这个问题时,bash版本是bash-4.2。

在这个版本中,纯bash打印当前时间的方式是:

printf '%(%T)T\n' -1

or

printf '%(%T)T\n' -1

所以一个简短的函数登录每一行的时间戳可以是:

logLine() {
    printf '%(%T)T %s\n' -1 "$*"
}

Then

$ logLine Hello world.
10:11:32 Hello world.

今天,我使用bash-5.1.4…

从bash版本5.0-alpha开始,(2018-05-22):

b.变量EPOCHSECONDS扩展为以秒为单位的时间 从Unix时代开始。 c.有一个EPOCHREALTIME变量,扩展为以秒为单位的时间 从Unix时代开始的微秒粒度。

所以如果你想使用微秒粒度,函数可以变成:

logLine() {
    local now=$EPOCHREALTIME
    printf '%(%T)T.%s %s\n' ${now%.*} ${now#*.} "$*"
}

Then

$ logLine Hello world.
10:15:56.862732 Hello world.

重要提示:不要混淆EPOCHREALTIME和EPOCHSECONDS!!

使用命令替换:

timestamp=$( date +%T )

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

#!/bin/bash

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

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

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

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

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