【问题标题】:bash while loop breaking too earlybash while 循环中断太早
【发布时间】:2015-08-25 03:31:15
【问题描述】:

我对 bash(一般编程)比较陌生,并且大部分时间都是自学的,但我有一个 while 循环,只有在满足所有条件时才应该退出。

while  [[ "$var1" != "$var1_tgt" ]] && [[ "var2" != "$var2_tgt" ]] && [[ "$var3" != "$var3_tgt" ]] && [[ "$var4" != "$var4_tgt" ]]; do LOOP...; done

我似乎遇到的问题(我认为)在于循环的评估。当我运行脚本时,如果只满足一个条件,它将中断,但我希望循环仅在满足所有条件时才中断。也就是说,当 var# 等于所有 var 的 var#_tgt 时,循环才会中断。据我所知,使用“&&”应该意味着在循环退出之前必须满足所有条件,但它不起作用的事实意味着我错过了一些东西。感谢您为解决这个问题提供的任何帮助。

【问题讨论】:

  • 你能帮助我们了解这个脚本实际上在做什么吗?例如,您可能从$var2_tgt 匹配$var 开始,$var2_tgt 匹配$var2,然后随着循环的进行,一个或多个变量将被更改,因此它们不再匹配目标。如果它们不匹配,你就会跳出循环。我说对了吗?如果是这样,您能否为我们提供设置变量的示例代码,以便我们测试事情的运行方式?

标签: bash while-loop


【解决方案1】:

您需要将循环更改为:

while  [[ "$var1" != "$var1_tgt" ]] || [[ "var2" != "$var2_tgt" ]] || [[ "$var3" != "$var3_tgt" ]] || [[ "$var4" != "$var4_tgt" ]]; do LOOP...; done

如果任何变量尚未达到目标,您想继续循环。

否则,一旦其中一个变量达到其目标,其中一个条件就会失败,循环就会中断。

【讨论】:

  • 我推断他想继续循环,只要 和 变量仍然在他们的目标。一旦变量不再在目标上,循环应该退出。
  • 如果我理解 JollyRoger 的困惑,这是正确的答案。我的看法是,他将while 子句视为循环的exit 条件,但它实际上是don't-exit 条件。因此,他的“和”与“或”倒退了。
  • 我的回答是基于“当 var# 等于所有 var 的 var#_tgt 时,循环才会中断”,我认为我没看错?
  • 抱歉造成混淆...变量最初开始偏离目标,随着时间的推移会达到它们的目标,但不是同时发生。我希望循环仅在所有变量都等于它们各自的目标之后才退出,而不是当只有一个达到各自的目标时才退出。我希望这有助于澄清。如果没有,我会尽我所能帮助澄清更多。感谢您的意见!
  • 我认为 machaelcurtis 可能已经回答了这个问题。他的推理听起来像我正在寻找的东西,但必须对其进行测试才能确定。
猜你喜欢
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2017-11-14
  • 2019-05-05
  • 2015-09-14
相关资源
最近更新 更多