Big ups to @Demosthenex and especially @Dennis Williamson for the shortest and easiest solution I've seen. Leave it to bash to require a bunch of parentheses for a simple ternary assignment. Ahh, the 60s! And to put it all together in an example...
echo $BASHRULES; # not defined
# no output
: ${BASHRULES:="SCHOOL"} # assign the variable
echo $BASHRULES # check it
SCHOOL # correct answer
: ${BASHRULES="FOREVER?"} # notice the slightly different syntax for the conditional assignment
echo $BASHRULES # let's see what happened!
SCHOOL # unchanged! (it was already defined)
I wrote that a long time ago.. these days I'd probably get more excited over a solution like...
In addition to the other more general answers (particularly as per Jonathan's comment and Kevin's more general answer [which also supports strings]) I'd like to add the following two solutions:
setting the variable to either 0 or 1 based on the condition:
(as the question's example suggests.)
The general form would read
(condition); variable=$?;
where $variable results in being either 0 or 1 and condition can be any valid conditional expression.
E.g. checking a variable ...
[[ $variableToCheck == "$othervariable, string or number to match" ]]
variable=$?
... or checking a file's existence ...
[ -f "$filepath" ]
fileExists=$?
... or checking the nummerical value of $myNumber:
that variable gets declared in any case, unlike in griffon's answer: [ -z "$variable" ] && variable="defaultValue" Which would matter in case you want to nameref it later on (e.g. from within a function).
Please note: In Bash, the special variable $? always contains the exit code of the previously executed statement (or statement block; see the man bash for more details). As such, a positive result is generally represented by the value 0, not 1 (See my comment below, thanks Assimilater for pointing it out). Thus, if the condition is true (e.g [[2 eq 2]]) then $?=0.
If instead you need 0 or 1 in your variable (e.g. to print or do mathematical calculations) then you need to employ boolean negation using a leading exclamation mark (as pointed out by GypsySpellweaver in the comments below): ( ! condition ); variable=$? or ! ( condition ); variable=$?. (However, readability in terms of what happens might be a bit less obvious.)
Another possible solution by Jonathan would be variable=$(( 1 == 1 ? 1 : 0 )) - which, however, is creating a subshell.
If you want to avoid the creation of a subshel, keep good readability or have arbitrary conditions, use one of the following solutions.
setting the variable to arbitrary values:
as it is done in most other answers, it could adapted as follows:
that variable gets declared in any case, unlike in griffon's answer: [ -z "$variable" ] && variable="defaultValue" Which would matter in case you want to nameref it later on (e.g. from within a function).