限制bash while循环到10次重试

时间:2014-11-28 14:38:16

标签: bash

这个while循环如何限制为最多10次重试?

#!/bin/sh
while ! test -d /somemount/share/folder
do
    echo "Waiting for mount /somemount/share/folder..."
    sleep 1
done

4 个答案:

答案 0 :(得分:13)

保留一个柜台:

#!/bin/sh

while ! test -d /somemount/share/folder
do
    echo "Waiting for mount /somemount/share/folder..."
    ((c++)) && ((c==10)) && break
    sleep 1
done

答案 1 :(得分:3)

您还可以使用for循环并在成功时将其退出:

for try in {1..10} ; do
    [[ -d /somemount/share/folder ]] && break
done

问题(在其他解决方案中也存在)是,一旦循环结束,你就不知道它是如何结束的 - 是找到目录,还是计数器耗尽了?

答案 2 :(得分:2)

我会评论,但我没有足够的分数。无论如何我想要贡献。 因此,即使while循环嵌套在另一个循环中,这也使它工作。在中断之前,c变量被重置为零。 提出原始解决方案的@anubhava的信用。

#!/bin/sh

while ! test -d /somemount/share/folder
do
    echo "Waiting for mount /somemount/share/folder..."
    ((c++)) && ((c==10)) && c=0 && break
    sleep 1
done

答案 3 :(得分:1)

您可以使用until(而不是“ while!... break ),但有一个计数器限制:

COUNT=0
ATTEMPTS=10
until [[ -d /somemount/share/folder ]] || [[ $COUNT -eq $ATTEMPTS ]]; do
  echo -e "$(( COUNT++ ))... \c"
  sleep 1
done
[[ $COUNT -eq $ATTEMPTS ]] && echo "Could not access mount" && (exit 1)

注意:

  • 就像将counter设置为变量一样,您可以设置var condition="[[ .. ]]",然后使用until eval $condition使其更通用。
  • echo $ {((COUNT ++))在打印时增加计数器。

  • 如果在函数内部运行,请使用“返回1”代替“退出1”。