Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将bash while循环限制为10次重试_Bash - Fatal编程技术网

将bash while循环限制为10次重试

将bash while循环限制为10次重试,bash,Bash,如何将此while循环限制为最多10次重试 #!/bin/sh while ! test -d /somemount/share/folder do echo "Waiting for mount /somemount/share/folder..." sleep 1 done 保留柜台: #!/bin/sh while ! test -d /somemount/share/folder do echo "Waiting for mount /somemount/sh

如何将此while循环限制为最多10次重试

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

#!/bin/sh

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

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

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

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

我会发表评论,但我没有足够的分数来说明这一点。无论如何,我都想贡献自己的力量。 因此,即使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

您可以使用带有计数器限制的
直到
(而不是“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)
注:

  • 就像将计数器设置为变量一样,您可以设置var
    条件=“[..]]”
    ,并使用
    直到eval$condition
    使其更通用
  • echo$((COUNT++)在打印时增加计数器

  • 如果在函数内部运行,请使用“返回1”而不是“退出1”


    • ((x++);如果[[x-eq 10]];那么break;fi
      可以执行
      ((c++)和((c==10))如果你不打算声明和/或取消设置变量<代码> C <代码>,那么你应该考虑把整个循环放在一个子shell或一个函数中。这不会是一样的吗?你怎么知道它是如何结束你的答案的?“JIDD:它会的。这就是为什么我使用了”和“也”。“.啊,对了,误读了,对不起!您可以添加
      [[-d/somemount/share/folder]]&&break&&echo“已成功装载”
      来解决此问题:)@user3442743-中断必须是最后一个,否则将无法打印(即
      [[condition]]&&echo“已通过”&&break