Home > Software design >  While loop and set [duplicate]
While loop and set [duplicate]

Time:09-16

I have the following while loop in bash:

set -euo pipefail
x=0
rounds=10

while [ $x -le $rounds ]
do
    y=$(($x 1))
    echo $x
    echo $y
    ((x  ))
done

But it stops after one iteration:

$ bash test.sh
0
1

Only when I remove set -euo pipefail, my loops run through completely. Why is that?

CodePudding user response:

((x )) fails. set -e tells bash to exit if any command fails. Don't use set -e.

From the bash man page:

   ((expression))
          The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION.  If the value of the expression is non-zero, the
          return status is 0; otherwise the return status is 1.  This is exactly equivalent to let "expression".

You should probably just do either echo $((x )) to increment x, or do ((x )) || true, or : $((x )), or (most reasonable) stop using set -e.

You could use (( x)), but I think that's a bad idea, since it hides the problem instead of fixing it. If you ever had a loop that was running from x < 0, you would suddenly encounter a very unexpected bug. Really, the right thing to do is to stop using set -e.

  • Related