在带有条件语句的 while 循环中放置错误消息
Posted
技术标签:
【中文标题】在带有条件语句的 while 循环中放置错误消息【英文标题】:placements of an error message in while loop with conditional statements 【发布时间】:2014-06-14 12:00:00 【问题描述】:此脚本每 5 秒检查一次文件是否存在,仅持续 30 秒。脚本等待文件出现 如果它找到文件,它会回显“信息:完成等待”。
我遇到的问题是退出后的错误消息 如果找不到文件,则在 30 秒后。
脚本的配置方式现在每次循环后都会打印错误超时。
#!/bin/bash
count=1
while [ $count -le 6 ]
do
if [ ! -e /tmp/2007.txt ]
then
echo "info : sleeping for 5 seconds"
(( count++ ))
sleep 5
elsif [ -e /tmp/2007.txt ]
echo "info: done waiting"
break
fi
echo "error: timeout"
done
这就是我得到的(坏的)
info : sleeping for 5 seconds
error: timeout
info : sleeping for 5 seconds
error: timeout
info : sleeping for 5 seconds
error: timeout
info : sleeping for 5 seconds
error: timeout
info : sleeping for 5 seconds
error: timeout
info : sleeping for 5 seconds
error: timeout
如果我把它放在循环之外——效果很好
break
fi
done
echo "error: timeout"
这是我得到的
casper_mint@casper-mint-dell ~ $ /tmp/wait_while
info : sleeping for 5 seconds
info : sleeping for 5 seconds
info : sleeping for 5 seconds
info : sleeping for 5 seconds
info : sleeping for 5 seconds
info : sleeping for 5 seconds
error: timeout
casper_mint@casper-mint-dell ~ $
但是,如果我触摸 /tmp/2007.txt 文件 - 它会中断但错误超时 仍然出现
casper_mint@casper-mint-dell ~ $ /tmp/wait_while
info : sleeping for 5 seconds
info : sleeping for 5 seconds
info: done waiting
error: timeout
这是一个简单的问题,但我将它带到社区,因为它反映了我在理解带有条件语句的循环以及放置这些语句的位置时遇到的一个常见问题。我在编写脚本时经常遇到这种情况,我需要理解这一点,我需要不断发展。我正在寻找的只是检查 30 秒的脚本,如果它没有找到任何东西来抛出错误消息。如果脚本找到该文件,我希望它让我知道而不是踢出错误消息。
【问题讨论】:
【参考方案1】:您可以在 while 循环之后检查文件是否找到,然后再显示错误消息。
#!/bin/bash
found=0
count=1
while [ $count -le 6 ]
do
if [ ! -e /tmp/2007.txt ]
then
echo "info : sleeping for 5 seconds"
(( count++ ))
sleep 5
else
echo "info: done waiting"
found=1
break
fi
done
if [ ! $found ]
then
echo "error: timeout"
fi
【讨论】:
您可以使用算术表达式进行比较,例如:while (( count <= 6 ))
。另外,如果您使用 bash,则不应使用 [ ]
,请优先使用 [[ ]]
。【参考方案2】:
您只希望在while
循环“失败”时打印“超时”消息,也就是说,如果从未找到所需的文件。您可以使用以下内容:
while (( ++count <= 6 ))
do
if [ ! -e /tmp/2007.txt ]
then
echo "info : sleeping for 5 seconds"
sleep 5
elif [ -e /tmp/2007.txt ]; then
echo "info: done waiting"
break
fi
false
done || echo "error: timeout"
如果找到了/tmp/2007.txt
,则循环中要运行的最后一个命令将是echo
语句(或[ -e /tmp/2007.txt ]
,如果您删除了日志记录),其退出状态为零。否则,最后运行的命令是false
,它始终具有非零退出状态,因此循环的退出状态也将非零。
【讨论】:
【参考方案3】:您可以让“while”循环检查文件是否存在,或者让“while”循环休眠 30 秒:
让“while”循环检查文件是否存在:
#!/bin/bash
count=0
timed_out=false
while [ ! -e file ]; do
echo "info : sleeping for 5 seconds"
((count++))
sleep 5
if [ $count -eq 6 ]; then
timed_out=true
break
fi
done
if $timed_out; then
echo "error: timeout"
exit 1 # error
else
echo "info: done waiting"
exit 0 # success
fi
让“while”循环休眠 30 秒:
#!/bin/bash
timed_out=true
count=0
while [ $count -lt 6 ]; do
if [ ! -e file ]; then
echo "info : sleeping for 5 seconds"
((count++))
sleep 5
else
timed_out=false
break
fi
done
if $timed_out; then
echo "error: timeout"
exit 1 # error
else
echo "info: done waiting"
exit 0 # success
fi
【讨论】:
以上是关于在带有条件语句的 while 循环中放置错误消息的主要内容,如果未能解决你的问题,请参考以下文章