我想生成一系列时间戳并与最大限制进行比较。我想使用 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
价值上。
我错过了什么吗?
与 一起使用时[ ... ]
,未加引号的>
是重定向运算符。这意味着您现在可能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 倍)。
归档时间: |
|
查看次数: |
152 次 |
最近记录: |