首先,我是shell脚本的初学者。我所做的这段代码不起作用。
我想重复一段代码30秒,但它不起作用。它只是无限期地继续做我的逻辑。
DIFF=0
while [ $DIFF < 30 ]; do
START=$(date +%s)
######## My logic #########
DIFF=$(( $END - $START ))
echo $DIFF
cd ..
sleep 5s
done
我认为这是因为我没有正确地执行while子句?
答案 0 :(得分:2)
嗯,您肯定需要为$START
和$END
提供一些值。他们不会自己设定!
您可能想要执行类似
的操作START = `date +%s`
将其设置为以秒为单位的时间。当然,需要在循环中设置END
以更新它。
编辑:cd ..
希望不是你计划在循环中运行的。在几毫秒内,您当前的目录将成为根目录,其他几乎没有完成。单一cd /
会更便宜。
编辑2:这应该不是一个很难的问题。对于这个编辑,我已经构建并测试了一个单行解决方案:
START=$(date +%s); DIFF=0; while [ $DIFF -lt 30 ]; do echo $DIFF; DIFF=$(($(date +%s)-$START)); done
这将正确更新其变量并显示它们......并在30秒后结束。
答案 1 :(得分:2)
((end = $(date +%s) + 30))
while (( $(date +%s) < end ))
do
something
done
或者,在Bash中使用内置变量$SECONDS
:
((end = SECONDS + 30))
while (( SECONDS < end ))
do
something
done
答案 2 :(得分:1)
看起来你正在使用bash。
尝试这样的事情:
START=...
while (($DIFF<30)); do
# ....
DIFF=$((END-START))
done
(请参阅Bash arithmetic evaluation和The Double-Parentheses Construct。)
答案 3 :(得分:1)
使用无限循环。示例伪代码
DIFF=0
while true
do
START=$(date +%s)
END=.... #define your end
DIFF=$((END-START))
if [ "$DIFF" -gt 30 ] ;then
break
fi
.....
done