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

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

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

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

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

840515 次浏览

使用命令替换:

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指定符给出的格式,您可以结合date所接受的其他时间转换说明符。对于GNU date,你可以在官方文档中找到这些说明符的完整列表:https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

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

timestamp=$(date +%s)

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

你可以使用

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

它以2014-02-01 15:12:35-05:00格式交付

反勾号(`)字符将导致它们之间的内容被计算,并将结果包含在行中。date --help有其他选择。

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

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

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


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

我使用的是ubuntu 14.04。

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

date +%T的输出类似于12:25:25

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

2018-12-23_12-34-56

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

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

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

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

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

%(...)T使用相应的参数作为UNIX时间戳,并根据括号之间的# eyz1风格格式对其进行格式化。参数-1对应于当前时间,当不会出现歧义时可以省略。

对于我的欧洲同胞,试试这个:

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

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

你调用这个变量并得到像这样的字符串表示

$timestamp

有很多答案,但找不到我想要的:

date +"%s.%3N"

返回类似1606297368.210的内容

这比您要求的要多一点,因此您可以根据需要定制它。

我试图在一个shell脚本中创建一个时间戳变量…

这个脚本将允许您创建一个变量。尽管我不完全确定在更改shell上下文时可重用性如何。但它会起作用。

function timestamp {
TEXT="Date:"
DATE=`date +%Y-%m-%d`
TIME=`date +%H:%M:%S`
ZONE=`date +"%Z %z"`
echo $TEXT $DATE $TIME $ZONE
}


function fulldate {
timevariable=$(timestamp)
echo $timevariable
}


echo "- Output 1:"
timestamp
echo "- Output 2:"
fulldate
echo "- Output 3:"
echo $timevariable

输出:

- Output 1:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 2:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 3:
Date: 2021-08-12 23:28:08 UTC +0000

我已经在GNU bash版本4.4.23(1)-release (x86_64-pc-msys)上进行了测试

您可以根据需要参考下表生成时间戳:

        Format/result           |       Command              |          Output
--------------------------------+----------------------------+------------------------------
YYYY-MM-DD                      | date -I                    | $(date -I)
YYYY-MM-DD_hh:mm:ss             | date +%F_%T                | $(date +%F_%T)
YYYYMMDD_hhmmss                 | date +%Y%m%d_%H%M%S        | $(date +%Y%m%d_%H%M%S)
YYYYMMDD_hhmmss (UTC version)   | date --utc +%Y%m%d_%H%M%SZ | $(date --utc +%Y%m%d_%H%M%SZ)
YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z      | $(date +%Y%m%d_%H%M%S%Z)
YYYYMMSShhmmss                  | date +%Y%m%d%H%M%S         | $(date +%Y%m%d%H%M%S)
YYYYMMSShhmmssnnnnnnnnn         | date +%Y%m%d%H%M%S%N       | $(date +%Y%m%d%H%M%S%N)
YYMMDD_hhmmss                   | date +%y%m%d_%H%M%S        | $(date +%y%m%d_%H%M%S)
Seconds since UNIX epoch:       | date +%s                   | $(date +%s)
Nanoseconds only:               | date +%N                   | $(date +%N)
Nanoseconds since UNIX epoch:   | date +%s%N                 | $(date +%s%N)
ISO8601 UTC timestamp           | date --utc +%FT%TZ         | $(date --utc +%FT%TZ)
ISO8601 UTC timestamp + ms      | date --utc +%FT%T.%3NZ     | $(date --utc +%FT%T.%3NZ)
ISO8601 Local TZ timestamp      | date +%FT%T%Z              | $(date +%FT%T%Z)
YYYY-MM-DD (Short day)          | date +%F\(%a\)             | $(date +%F\(%a\))
YYYY-MM-DD (Long day)           | date +%F\(%A\)             | $(date +%F\(%A\))

如果考虑性能,@chepner的回答显然是赢家。

稍微复杂一点的是,您还可以只使用bash内置程序获得微秒或毫秒级的粒度。下面是一个函数的例子,它发出包含毫秒的当前时间戳:

timestamp() {
IFS=. read S US <<<$EPOCHREALTIME # Read epoch seconds/microseconds
MS=$((10#$US/1000)) # Convert to milliseconds (interpret in base-10, even with leading 0)
printf '%(%F %T)T.%03i' $S $MS # Emit formatted timestamp
}


TS=$(timestamp) # Invoke function, assign to variable

请注意,printf格式可以调整为您首选的日期/时间格式。

下面将给出当地的日期和时间-但它确实需要互联网访问。根据所记录的内容,这可能是有益的—监视和记录连接状态?

curl -i --silent https://google.com/ 2>&1 | grep date


date: Fri, 03 Jun 2022 17:39:19 GMT

您可以使用以下命令来完成此操作。

对于带秒的时间戳:checkDate=$(date "+%s")

格式化日期:checkDate=$(date "+%Y-%m-%d %H:%M:%S")