while 循环比较时间戳

The*_*Guy 3 bash shell-script

我想生成一系列时间戳并与最大限制进行比较。我想使用 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
Run Code Online (Sandbox Code Playgroud)

但是这个循环一直在进行,而不是停留在$end_ts价值上。

我错过了什么吗?

Kus*_*nda 7

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

命令

[ "$start_ts" > "$end_ts" ]
Run Code Online (Sandbox Code Playgroud)

也可以写

[ "$start_ts" ] >"$end_ts"
Run Code Online (Sandbox Code Playgroud)

(参见例如此命令如何合法?> file1 < file2 cat")。这是对字符串"$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
Run Code Online (Sandbox Code Playgroud)

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