我正在使用 CentOS,我想编写一个 shell 脚本。所以
我有一个带有日期的文件:
>
> cat VM1_EOMAP_TIME.log
07 Sep 2022 16:30
>
我想获取自当前时间以来的分钟数和文件中的日期
我的想法是:(“从当前时间开始的纪元”-“从该文件的日期开始的纪元”)/60
但我无法获得“当前时间的纪元”
> cat VM1_EOMAP_TIME.log
07 Sep 2022 16:30
> date --date='07 Sep 2022 16:30' +%s
1662568200
> date --date=$(cat VM1_EOMAP_TIME.log) +%s
date: extra operand ‘2022’
Try 'date --help' for more information.
> date --date=`cat VM1_EOMAP_TIME.log` +%s
date: extra operand ‘2022’
Try 'date --help' for more information.
> TTT="07 Sep 2022 16:30"
> echo $TTT
07 Sep 2022 16:30
> date --date=$TTT +%s
date: extra operand ‘2022’
Try 'date --help' for more information.
为什么我收到“日期:额外操作数‘2022’”错误?
答案1
如果您的 bash 是最近的,则当前时间(纪元秒)是内置的:$EPOCHSECONDS
否则,bash 的 printf 可以使用%(fmt)T
指令和魔术值“-1”来获取它:
printf -v current_epoch '%(%s)T' -1
此外,bash 有一个内置的便利$(cat file)
=> $(<file)
:
log_epoch=$( date -d "$(<VM1_EOMAP_TIME.log)" "+%s" )
答案2
你的问题是引用。您应该用它date -u
来补偿时区。
$ echo "07 Sep 2022 16:30" > infile
$ var="$(<infile)"
$ cat infile; echo "$var"
07 Sep 2022 16:30
07 Sep 2022 16:30
$ date -ud "$(<infile)" ; date -ud "$var" +%s
1662568200
1662568200
$ varlog=$(date -ud "$var" +%s) #capture value for later
bash 中还有其他更简单的解决方案:
$ echo "$EPOCHSECONDS"; printf '%(%s)T' '-1'
1662582600
1662582600
$ var1="$EPOCHSECONDS"; printf -v var2 '%(%s)T' '-1'
$ echo "$var1 $var2"
1662568200 1662568200
所以,最终的数学可能是:
$ echo $((var2 - varlog))
10747
$ echo $(((var2-varlog)/60))
179
答案3
$ let diff=($(date +%s -d 'today')-$(date +%s -f VM1_EOMAP_TIME.log))/60
$ echo "$diff"