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
In computer science, a Boolean is a logical data type that can have only the values true or false . For example, in JavaScript, Boolean conditionals are often used to decide which sections of code to execute (such as in if statements) or repeat (such as in for loops).
There are no Booleans in Bash. However, we can define the shell variable having value as 0 (“ False “) or 1 (“ True “) as per our needs. However, Bash also supports Boolean expression conditions.
Bash does not support Boolean values, but any bash variable can contain 0 or “true” and 1 or “false“. The logical boolean operators are supported by bash. The boolean value is required to use when the script needs to generate the output based on the True or False value of a variable.
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). true
and false
are commands; true
exits with value 0, and false
exits with a nonzero value. An if
statement in bash taks a command; if that command returns 0, then the then
clause is executed, otherwise the else
clause is.
doFirst= true
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:
doFirst="" true
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.
if $doFirst ; then
This expands the $doFirst
variable, and tries to interpret the result as a command. Oddly, if $doFirst
is undefined (which it is, as I explain above), this takes the then
branch. At that point, you make your first mistake again, trying to set a variable to be false, and again, nothing happens; $doFirst
is 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:
doFirst=true
# ...
if [ $doFirst = true ]; then
doFirst=false
# ...
Are you actually putting a space between the =
and the "true"/"false" or is that a formatting error? That's one of your problems.
Another, as mentioned by Anders Lindahl in the comment section, is that when you set a variable in shell scripting, you cannot use the $
in the front. You must say
doFirst=false
Again, note that there are no spaces around the equals sign.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With