我正在学习bash脚本,我想每隔5秒调用一次函数x秒。运行脚本时,x由命令行参数确定。我已经尝试过了,但它似乎永远持续下去,我似乎没有能力在x秒后返回。可能有一种睡眠方式,但它看起来很笨拙,我不得不处理局部漂移。有优雅的解决方案吗?
我的代码:
#!/bin/bash
if [ $# -ne 1 ]; then # only 1 command line arg allowed
echo "Incorrect arguments"
exit 1
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit
echo "Argument must be a positive number"
exit 1
fi
ask()
{
OUTPUT=$(snmpwalk -v2c -c community server oib)
CLEANOUTPUT="${OUTPUT:32}%"
echo $CLEANOUTPUT
}
#export -f ask
#watch -n5 ask
答案 0 :(得分:2)
SECONDS
变量计算自bash
启动以来的秒数:
#!/bin/bash
while (( SECONDS <= 20 ))
do
echo "Running something"
sleep 5 || break
done
echo "Done"
这个简单的方法在最后一次运行后sleep 5
,即使你知道它超过20秒,也不会试图考虑命令的运行时间(如果命令运行的话) 2秒,它每7秒开始一次启动。
答案 1 :(得分:1)
如果你想要更准确一些时间,你可以将sleep
放入后台,做任何需要的工作,然后使用wait
,这将暂停前台处理,直到sleep
退出。虽然准确性不会很完美,但至少不包括工作部分所花费的时间。
类似的东西:
#!/bin/bash
LOOPTIMES=3
REPEATEVERY=5 # seconds
for (( count=0 ; $count < $LOOPTIMES ; count++ ))
do
/bin/sleep $REPEATEVERY &
echo "Doing work $count..."
# do whatever
wait # this will wait until the sleep exits
done
退出0
答案 2 :(得分:0)
#!/bin/bash
if [ $# -ne 1 ]; then # only 1 command line arg allowed
echo "Incorrect arguments"
exit 1
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit
echo "Argument must be a positive number"
exit 1
fi
iterations=$(($1/5))
for i in $(seq 1 $iterations);
do
OUTPUT=$(snmpwalk -v2c -c community server oib)
CLEANOUTPUT="${OUTPUT:32}%"
echo $CLEANOUTPUT
sleep 5
done