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.
