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

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

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

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


当前回答

如果性能是一个问题,@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格式可以调整为您首选的日期/时间格式。

其他回答

您可以参考下表生成各种格式的时间戳:

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

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

我试图在一个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)上进行了测试

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

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