Boolean in Shell Scripting
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.