在带有条件语句的 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 循环中放置错误消息的主要内容,如果未能解决你的问题,请参考以下文章

java介绍while循环

java介绍while循环

17 C#中的循环执行 while循环

实验五——循环结构学习总结

如果在 while 循环的条件之后放置一个分号会发生啥?

python流程控制-条件语句If,while循环