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