我们必须小心循环。
例如,如果您要检查文件以启动算法,则可能必须执行以下操作:
FILE_TO_CHECK="/var/logs/deployment.log"
LINE_TO_CONTAIN="Server started"
SLEEP_TIME=10
while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
do
sleep ${SLEEP_TIME}
done
# Start your algorithm here
但是,为了防止无限循环,您应该添加一些界限:
FILE_TO_CHECK="/var/logs/deployment.log"
LINE_TO_CONTAIN="Server started"
SLEEP_TIME=10
COUNT=0
MAX=10
while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") -a ${COUNT} -lt ${MAX} ]
do
sleep ${SLEEP_TIME}
COUNT=$(($COUNT + 1))
done
if [ ! $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
then
echo "Let's go, the file is containing what we want"
# Start your algorithm here
else
echo "Timed out"
exit 10
fi
$(SLEEP_TIME)
应该是${SLEEP_TIME}
。无需花费大量精力就可以使用grep。大写变量是个坏习惯。感谢您的评论。我已经修复了
${SLEEP_TIME}
。关于命名约定,使用小写字母似乎是一个更好的主意,以便不覆盖环境变量。while循环中的逻辑不是颠倒了吗?只要grep找到了东西,它就会循环,如果找不到,它就会停止。怎么样
until grep -q string file ; do sleep 1s ; done
?grep找到匹配项时返回0,否则返回 1。unixhelp.ed.ac.uk/CGI/man-cgi?grep
确实,但是将其放在里面
[ $() ]
意味着[
控件的退出值while
,并且它将仅测试命令($()
)的输出是否为非空字符串。您可以尝试使用if [ $( true ) ] ; then echo true ; fi
。