I miss here the key point, which is portability. That's why my header has POSIX in itself.
Essentially, all of the voted answers are correct, with the exception they are Bash-specific too much.
Basically, I only wish to add more information about portability.
[
and ]
brackets like in [ "$var" = true ]
are not necessary, and you can omit them and use the test
command directly:
test "$var" = true && yourCodeIfTrue || yourCodeIfFalse
Important note: I no longer recommend this as it's being slowly deprecated and more difficult to combine multiple statements.
Imagine what those words true
and false
mean to the shell, test it yourself:
echo $(( true ))
0
echo $(( false ))
1
But using quotes:
echo $(( "true" ))
bash: "true": syntax error: operand expected (error token is ""true"") sh (dash): sh: 1: arithmetic expression: expecting primary: ""true""
The same goes for:
echo $(( "false" ))
The shell can't interpret it other than a string. I hope you are getting the idea of how good it is using proper keyword without quotes.
But no one said it in previous answers.
What does this mean? Well, several things.
You should get used to the Boolean keywords are actually treated like numbers, that is true
= 0
and false
= 1
, remember all non-zero values are treated like false
.
Since they are treated as numbers, you should treat them like that too, i.e. if you define variable say:
var_bool=true
echo "$var_bool"
true
you can create an opposite value of it with:
var_bool=$(( 1 - $var_bool )) # same as $(( ! $var_bool ))
echo "$var_bool"
1
As you can see for yourself, the shell does print true
string for the first time you use it, but since then, it all works via number 0
representing true
or 1
representing false
, respectively.
First, one good habit would be assigning 0
instead of true
; 1
instead of false
.
Second good habit would be to test if the variable is / isn't equal to zero:
if [ "$var_bool" -eq 0 ]; then
yourCodeIfTrue
else
yourCodeIfFalse
fi