Create timestamp variable in bash script
我正在尝试在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。 我想在脚本的开头创建变量,并在发出echo $timestamp时打印出当前时间。 事实证明,这比我想象的要困难得多。 以下是我尝试过的一些事情:
timestamp="(date +"%T")" echo打印出(date +"%T")
timestamp="$(date +"%T")" echo打印变量初始化的时间。
我尝试过的其他事情只是轻微的变化,没有任何改善。 有谁知道如何完成我想要做的事情?
如果你想获得unix时间戳,那么你需要使用:
%T会给你时间;与%H:%M:%S相同(通过http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/)
-
但是这个变量只会保存变量启动时的值,对吗?
-
我想这会得到很多赞成,因为它回答了问题的标题,但它没有回答问题正文:D OP希望每次都得到一个不同的时间戳,而这将为整个脚本存储一个。
-
我来到这里正是在寻找这个。即从date获取unix时间戳的正确格式字符串。但是,我也赞成了"正确"的答案。我不是那么想,但这是对原始问题的一个更好的答案,它对我来说也很有用。
为了获得当前时间戳而不是定义固定变量的时间,诀窍是使用函数而不是变量:
1 2 3 4 5 6 7 8 9 10 11 12
| #!/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
-
根据您打算如何使用它,您仍然需要使用命令替换:echo"$(timestamp): something happened"。
-
至于格式化,这里有一组最常见的格式:zxq9.com/archives/795
-
对我来说,我想要date +"%Y-%m-%d_%H-%M-%S"
-
很高兴知道为什么有人认为这个答案是错误的:6个downvotes,但没有人愿意解释原因。通过阅读问题,我真的看不出答案有什么问题。
-
由于某种原因,这并没有给我时间戳,而是当前时间与":"之间。
-
我想很多人都会在这个问题上找到一种方法来生成一个unix时间戳(正如我所知)并找到dchakarov的答案更有用,即使这个答案能更好地解决提问者的问题。
-
@erikbwork或任何想要unix时间戳的人只需使用date +%s即可
1 2 3
| DATE=`date"+%Y%m%d"`
DATE_WITH_TIME=`date"+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too |
-
谢谢,这就是我想要的:一个时间戳作为在我的脚本中重复使用的变量! shell语法非常混乱。
-
+1用于添加毫秒部分。这echo $(date +"%Y-%m-%dT%T.%3N%z")但是我不能让它在Mac终端上工作。如何在Mac中做同样的事情。谢谢
ISO 8601格式(2018-12-23T12:34:56)比UNIX时间戳更具可读性。但是在某些操作系统上,文件名中不能包含:。因此,我建议使用类似的东西:
您可以使用以下命令以此格式获取时间戳:
这是我见过许多应用程序使用的格式。另一个好处是,如果你的文件名以此开头,你可以按字母顺序对它们进行排序,它们将按日期排序。
使用命令替换:
-
这是我已经尝试过的,它只打印出变量初始化的时间。
-
@ dan08:这就是变量的工作原理。如果需要动态输出,请使用函数。
我正在使用ubuntu 14.04。
我系统中的正确方法应该是date +%s。
date +%T的输出类似于12:25:25。
您可以使用
1
| timestamp=`date --rfc-3339=seconds` |
这提供格式2014-02-01 15:12:35-05:00
反向标记(`)字符将导致它们之间的内容被评估并将结果包含在该行中。 date --help还有其他选择。
-
至于它到达的时间,应该在包含在屏幕输出之前立即执行,或者在列出输出时间的日志文件中执行。
-
由于输出中的空间,这不是理想的时间戳格式。一定要在使用中引用它"$ timestamp",否则你会得到两个参数。例如touch $timestamp将生成两个文件。
最新版本的bash不需要调用外部程序date:
1
| printf -v timestamp '%(%T)T' |
%(...)T使用相应的参数作为UNIX时间戳,并根据括号之间的strftime样式格式对其进行格式化。 -1的参数对应于当前时间,并且当不会出现歧义时可以省略。
1
| timestamp=$(awk 'BEGIN {srand(); print srand()}') |
没有值的srand使用大多数Awk实现的当前时间戳。