Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Boolean in Shell Scripting

Tags:

shell

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
like image 209
Bryan Wong Avatar asked Nov 25 '12 06:11

Bryan Wong


People also ask

What is Boolean in scripting?

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).

Does shell have Boolean?

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.

Does bash have Boolean?

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.


2 Answers

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
   # ...
like image 113
Brian Campbell Avatar answered Oct 25 '22 08:10

Brian Campbell


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.

like image 42
siride Avatar answered Oct 25 '22 09:10

siride