while 循环比较时间戳

while 循环比较时间戳

我想生成一系列时间戳并与最大限制进行比较。我想使用 while 循环来检查这一点。

这是我的代码。

start_ts='2021-08-07 15:00:00'
end_ts='2021-08-10 05:00:00'

while [ "$start_ts" > "$end_ts" ]
do 
  echo $start_ts
    start_ts=$(date -ud "$start_ts +0 + 30 minutes" +'%Y-%m-%d %H:%M:%S')
done

但这个循环一直在持续,而不是在$end_ts价值处停止。

我错过了什么吗?

答案1

与 一起使用时[ ... ],未加引号的>是重定向运算符。这意味着您现在可能2021-08-10 05:00:00在当前目录中有一个名为的文件,该文件是通过将[命令的输出重定向到文件而创建的。

命令

[ "$start_ts" > "$end_ts" ]

也可以写成

[ "$start_ts" ] >"$end_ts"

(参见例如这个命令怎么合法呢? "> 文件 1 < 文件 2 猫")。这是对字符串是否"$start_ts"非空的测试,并且该测试的输出(没有任何内容,因为[不输出任何内容)被重定向到文件$end_ts

当与 一起使用时[[ ... ]]>字符串比较运算符测试两个字符串是否以特定方式排序。这可能是您想要使用的,但为了获得正确的逻辑,您可以使用 <,或交换参数>,或使用until代替while


另一种方法是完全跳过字符串比较,而是使用 Unix 时间戳的整数比较:

start_ts=$( date -d '2021-08-07 15:00:00' +%s )
end_ts=$( date -d '2021-08-10 05:00:00' +%s )

while [ "$start_ts" -lt "$end_ts" ]; do 
    printf '%(%Y-%m-%d %H:%M:%S)T\n' "$start_ts"
    start_ts=$(( start_ts + 1800 ))
done

date由于循环内没有调用 GNU ,因此它的运行速度比原始代码快很多倍(在我的系统上大约快 50 倍)。

相关内容