在bash脚本中创建时间戳变量
我正在尝试在shell脚本中创建一个timestamp变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并在每次发出在bash脚本中创建时间戳变量,bash,variables,timestamp,Bash,Variables,Timestamp,我正在尝试在shell脚本中创建一个timestamp变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并在每次发出echo$timestamp时将其打印出当前时间。事实证明,这比我想象的要困难得多。以下是我尝试过的一些事情: timestamp=“(日期+%T”)”echo打印出(日期+%T”) timestamp=“$(日期+%T”)”echo打印变量初始化的时间 我尝试过的其他方法只是一些细微的变化,但效果并不好。有人知道如何完成我的任务吗?使用命令替换: timestamp=$(
echo$timestamp
时将其打印出当前时间。事实证明,这比我想象的要困难得多。以下是我尝试过的一些事情:
timestamp=“(日期+%T”)”
echo打印出(日期+%T”)
timestamp=“$(日期+%T”)”
echo打印变量初始化的时间
我尝试过的其他方法只是一些细微的变化,但效果并不好。有人知道如何完成我的任务吗?使用命令替换:
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
说明符提供的格式,可以将日期
接受的其他时间转换说明符组合在一起。对于GNUdate
,您可以在这里的官方文档中找到这些说明符的完整列表:如果您想要获得unix时间戳,那么您需要使用:
timestamp=$(date +%s)
%T
只会给你时间;与%H:%M:%S相同(通过)您可以使用
timestamp=`date --rfc-3339=seconds`
该文件的格式为2014-02-01 15:12:35-05:00
回勾(`
)字符将导致计算它们之间的内容,并将结果包含在行中<代码>日期--help
还有其他选项
timestamp=$(awk 'BEGIN {srand(); print srand()}')
没有值的srand在大多数Awk实现中使用当前时间戳。我使用的是ubuntu 14.04
DATE=`date "+%Y%m%d"`
DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
在我的系统中,正确的方式应该是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时间戳,并根据括号之间的strftime
样式格式对其进行格式化。-1
的参数对应于当前时间,并且可以忽略不会出现歧义的时间。对于我的欧洲同胞,尝试使用以下方法:
timestamp=$(date +%d-%m-%Y_%H-%M-%S)
将给出以下格式:“15-02-2020_19-21-58”
调用变量,得到如下字符串表示形式
$timestamp
答案很多,但找不到我想要的:
date +"%s.%3N"
返回类似于:
1606297368.210
这是我已经尝试过的,它只打印出变量初始化的时间。@dan08:变量就是这样工作的。如果您想要动态输出,请使用函数。根据您打算如何使用它,您仍然需要使用命令替换:echo“$(时间戳):发生了一些事情”
。至于格式,这里有一组最常用的格式:对于我来说,我想要date+%Y-%m-%d\u%H-%m-%S”
出于某种原因,这并没有给我时间戳,而是给了我当前时间:“介于两者之间。我想很多人都在寻找一种方法来生成unix时间戳(正如我所做的那样),并发现dchakarov的答案更有用,尽管这个答案更好地解决了提问者的问题。至于时间,这应该在包含在屏幕输出或日志文件中以列出输出时间之前立即执行。由于输出中的空间,这不是时间戳的理想格式。请确保在用法中引用它“$timestamp”,否则您将在命令中获得两个参数。e、 g.touch$timestamp
将生成两个文件。对于那些希望自定义此文件以删除空间的人,date--rfc-3339=…
大致相当于date'+%F%T%:z'
,因此删除空间非常简单(例如):date'+%F_%T%:z'
但是这个变量只会保存变量启动时的时间值,对吗?我想这会得到很多支持,因为它回答了问题的标题,但它没有回答问题主体:D OP希望每次都获得不同的时间戳,而这将为整个脚本存储一个。我来这里就是为了找这个。即从date
获取unix时间戳的正确格式字符串。然而,我也对“正确”的答案投了赞成票。我并不是在寻找这个答案,但这是对原始问题的一个更好的答案,对我来说也非常有用。在为添加毫秒部分预先编写了'shell`timestamp=$(shell日期+%s)
+1之后,我的工作做得很好。这echo$(日期+%Y-%m-%dT%T.%3N%z”)
但是我无法让它在Mac终端中工作。如何在Mac中执行同样的操作。谢谢<代码> TT= UTC日期+……/代码>可以通过使用UTC TimeStPad使其更便携。请考虑使用代码符号。或通用解决方案:<代码>日期+%-%-%%D%%-%%M%S/<代码>。谢谢您的回答。FWIW,对性能感到好奇:以下打印相同:(1)代码> AWK……< /代码>(如上所示);(2)date'+%s'
;(3)printf%(%s)T'
;按提高性能的顺序列出:在我的系统上,date
大约比awk
快2倍;printf
比date
快50倍以上,比awk
快100倍以上。