我试图在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并让它在发出echo $timestamp时打印出当前时间。事实证明这比我想象的要困难得多。以下是我尝试过的一些方法:
timestamp="(date +"%T")"回显输出(date +"%T")
timestamp="$(date +"%T")"回显变量初始化的时间。
我尝试过的其他方法都只是细微的变化,效果并不好。有人知道我要怎么做吗?
我试图在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并让它在发出echo $timestamp时打印出当前时间。事实证明这比我想象的要困难得多。以下是我尝试过的一些方法:
timestamp="(date +"%T")"回显输出(date +"%T")
timestamp="$(date +"%T")"回显变量初始化的时间。
我尝试过的其他方法都只是细微的变化,效果并不好。有人知道我要怎么做吗?
当前回答
最新版本的bash不需要调用外部程序日期:
printf -v timestamp '%(%T)T'
%(…)T使用相应的参数作为UNIX时间戳,并根据括号之间的strftime格式对其进行格式化。参数-1对应于当前时间,当不会出现歧义时可以省略。
其他回答
对于我的欧洲同胞,试试这个:
timestamp=$(date +%d-%m-%Y_%H-%M-%S)
将给出格式格式:“15-02-2020_19-21-58”
你调用这个变量并得到像这样的字符串表示
$timestamp
使用命令替换:
timestamp=$( date +%T )
你可以使用
timestamp=`date --rfc-3339=seconds`
发布格式为2014-02-01 15:12:35-05:00
反勾号(')字符将导致它们之间的内容被计算,并将结果包含在该行中。约会——帮助有其他选择。
您可以参考下表生成各种格式的时间戳:
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格式可以调整为您首选的日期/时间格式。