I have a problem with boolean for while loop. As such, I switch to for loop instead.
But still, I cannot change the value of a boolean after the condition is met.
doFirst= true
for (( j=1; j<=7; j++))
do
letter="A"
seatChoses=$letter$j
flagRand=$(echo $flightSeatBooked | awk -v flseatRand=$flightSeatBooked -v orseatRand=$seatChoses '{print match(flseatRand, orseatRand)}')
if $doFirst ; then
**$doFirst= false** // Here is the error!
if [ $flagRand -eq 0 ]; then
echo "System generated a slot, "$seatChoses" for you. [Y or N]"
fi
fi
done
There is no such thing as a boolean value in a shell script (that is, something you can store in a variable, and treat as a boolean).
trueandfalseare commands;trueexits with value 0, andfalseexits with a nonzero value. Anifstatement in bash taks a command; if that command returns 0, then thethenclause is executed, otherwise theelseclause is.This line doesn’t do what you expect at all. In a shell script, you cannot have any spaces after the equals sign. The space means you’re done with the assignment, and now writing a command. This is equivalent to:
Furthermore, if you have an assignment before a command (like this), that doesn’t actually perform the assignment in the shell. That sets that environment variable in the environment for that command alone; the assignment has no effect on anything outside of that command.
This expands the
$doFirstvariable, and tries to interpret the result as a command. Oddly, if$doFirstis undefined (which it is, as I explain above), this takes thethenbranch. At that point, you make your first mistake again, trying to set a variable to be false, and again, nothing happens;$doFirstis left undefined. You make the further mistake of trying to assign$doFirst; you use$to get the value of a variable, when setting, you use the bare name.My recommendation would be to not try to use booleans in Bash; just use strings instead, and check the value of the string. Note that I remove the space, so now I’m setting it to that exact string; and there is no command, so this sets the variable within the shell, not in the environment for a single command: