【问题标题】:bash nested while: outer loop executed only oncebash嵌套while:外循环只执行一次
【发布时间】:2023-05-16 18:58:02
【问题描述】:

以下 bash 脚本中的外层循环只执行一次,但应该执行四次:

#!/bin/bash 
NX="4"
NY="6"
echo "NX = $NX, NY = $NY"
IX="0"
IY="0"
while (( IX < NX ))
do
  while (( IY < NY ))
  do
    echo "IX = $IX, IY = $IY";
    IY=$(( IY+1 ))
  done;

  IX=$(( IX+1 ))
done

我也尝试将循环变量声明为declare -i NX=0(不带引号),但无论哪种方式我得到的输出都是

NX = 4, NY = 6
IX = 0, IY = 0
IX = 0, IY = 1
IX = 0, IY = 2
IX = 0, IY = 3
IX = 0, IY = 4
IX = 0, IY = 5

这是什么原因,我该如何解决?请注意,我更喜欢留下 NX="4"NY="6"(带引号),因为它们实际上来自另一个脚本。

【问题讨论】:

  • 在第一个 do 之后写 echo "IX = $IX",你会看到它完美循环!也就是说,它从 0 循环到 3。请提供更多关于您想要做什么的上下文,以便我们提供帮助。
  • 你为什么使用while循环而不是for开始? for ((ix=0; ix&lt;nx; ix++)) 会更具可读性,并且避免了这个错误。
  • @CharlesDuffy while 来自我为满足我的需要而编辑的脚本。我只是没有包括变量重置,因此错误。当然,for 工作正常 - 但我对条件语句的大量替代方案感到非常困惑,我不想深入研究。

标签: bash while-loop nested-loops


【解决方案1】:

在达到5 后,您需要将IY 重置为0。改为:

#!/bin/bash 
NX="4"
NY="6"
echo "NX = $NX, NY = $NY"
IX="0"
IY="0"
while (( IX < NX ))
do
  while (( IY < NY ))
  do
    echo "IX = $IX, IY = $IY";
    IY=$(( IY+1 ))
  done;
  IY="0"
  IX=$(( IX+1 ))
done

【讨论】:

    最近更新 更多