# How to build a conditional assignment in bash?

I'm looking a way to build conditional assignments in bash:

In Java it looks like this:

int variable= (condition) ? 1 : 0;


As per Jonathan's comment:

variable=$(( 1 == 1 ? 1 : 0 ))  ### EDIT: I revised the original answer which just echo'd the value of the condition operator, it didn't actually show any assignment. • Nit-pick: that isn't an assignment - it is just a conditional expression. However, variable=$(( 1 == 1 ? 1 : 0 )) works as long as there are no spaces around the first '=' sign; you can omit all the spaces after that and it also works - but think about readability. – Jonathan Leffler Mar 14 '10 at 4:54
• You can have complete freedom of spacing (and drop the dollar sign) if you move the opening double parentheses all the way to the left. (( variable = 1 == 1 ? 1 : 0 )) or (( variable = (1 == 1) ? 1 : 0 )) But it could be argued that it's more readable as given in the answer. – Dennis Williamson Mar 19 '10 at 16:29
• Also, it should be noted that this operator only works for arithmetic operations in Bash. – Dennis Williamson Mar 19 '10 at 16:36
• What if the variable I want to set is a string? – Giovanni Botta May 22 '15 at 16:10
• This does not work for strings: echo $(( 1 == 1 ? 'hello' : 'world' )) – 4aRk Kn1gh7 Dec 7 '15 at 6:28 If you want a way to define defaults in a shell script, use code like this: :${VAR:="default"}


Yes, the line begins with ':'. I use this in shell scripts so I can override variables in ENV, or use the default.

This is related because this is my most common use case for that kind of logic. ;]

• This is a valuable technique, but the only condition supported with the ':=' notation is 'set to "default" if value is unset or empty'. The more general notation in the question is supported directly in bash. – Jonathan Leffler Mar 14 '10 at 4:52
• I agree completely, I gave it a disclaimer for being slightly off topic. – Demosthenex Mar 14 '10 at 5:16
• Omitting the colon before equal tests only for the variable to be unset and doesn't change it if it's null. – Dennis Williamson Mar 19 '10 at 16:35
myvar="default" && [[ <some_condition_is_true> ]]  && myvar="non-default"


real examples:

DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM


The condition can be "(( ... ))" as well:

filepath=/proc/drbd && (( $# > 0 )) && filepath=$1


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

(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:

(( myNumber >= 1000000000 ))
is_huge_number=$?  ### The advantages of this solution is that • it supports arbitrary conditional expressions, including strings (which are not supported in arithmetic expressions of Jonathan's solution) • 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: (condition) \ && variable=true \ || variable=false  e.g as in [[$variableToCheck == "$othervariable, string or number to match" ]] \ && variable="$valueIfTrue" \
|| variable="$valueIfFalse"  or to get 1 in a positive check, and 0 upon failure (like in the question's example): [[$variableToCheck == "$othervariable, string or number to match" ]] \ && variable=1 \ || variable=0  (for the last example, - as already mentioned in the notes above - the same can be achieved with boolean negation using a leading exclamation mark: [[ !$variableToCheck == "$othervariable, string or number to match" ]] variable=$?


### The advantages of this solution is that

• it might be considered a bit better readable than Kevin's answer
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default", and
• the $valueIfTrue is conditionally evaluated only if needed, which would matter in case you'd do something • with side-effect, like • variable=$((i++)), or
• { variable=$1; shift; } • high computation, like • variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
• is a bit shorter than ghostdog74's answer
(which, however is great if you have multiple conditions!)
• does not open a subshell as in Pierre's answer
• and as above:
• it supports arbitrary conditional expressions, including strings
(which are not supported in arithmetic expressions of Jonathan's solution)
• 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). • The result of your first solution is a little confusing to me. A conditional that evaluates to true results in a value of 0; where a conditional that evaluates to false results in a value of 1 – Assimilater Sep 13 '16 at 6:23 • Maybe I did it wrong though. I test with [ "$1" == "--all" ] ; allperiods=$? ; echo$allperiods – Assimilater Sep 13 '16 at 6:25
• @Assimilater, I agree, that 0 and 1 might be confusing. It stems from the fact that an exit code of a program or statement is usually 0 when everything went ok, and an arbitrary code (usually between 1 and 254) for errors. Thus executable && executesWhenOk || executesWhenNotOk and in our scenario the test is the "executable" (or statement, to be precise), and the special variable $? contains the result code of the last statement. hope that helps clarifying. – Martin Rüegg Sep 14 '16 at 12:56 • That helps :) (You might consider adding it to the answer ;) ) – Assimilater Sep 15 '16 at 4:31 • The "normal" Boolean logic which programmers are adapted to, of 1 is true and 0 is false, can easily be achieved in this case with the NOT ! operator applied to the expression. Either inside, or outside the 'expression'. ( ! condition ); variable=$? or ! ( condition ); variable=$? Such that [ ! -f "$filepath" ]; fileExists=$? works as a programmer would be accustomed to: 1 file exists, and 0 file is missing. – Gypsy Spellweaver Feb 22 at 7:10 I wanted to do a conditional assignment with strings and I ended up with : SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")  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
: ${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...

PLATFORM=iphonesimulator
OTHERSDK=iphone && [[ $PLATFORM=~os ]] \ && OTHERSDK+=simulator \ || OTHERSDK+=os  $OTHERSDKiphoneos

• Thank you, Mr. @alex gray. This is an excellent syntactic arrow that everyone should have in their bash quiver… for the curious and/or unadventurous who discover it here, this sort of conditional assignment plays nice with export statements, too – which you put that between the colon prefix and the dollar-sign statement-y part, e.g. : export ${YO_DOGG:="global environment default"} – fish2000 Nov 5 '13 at 11:13 • Your second solution, actually represents the second solution of my answer and was added only after I've posted it. A short reference would have been nice. Please also note, since iphonesimulator does not contain the string os, above solution would end up with OTHERSDK=iphonesimulator. – Martin Rüegg Sep 15 '16 at 8:28 • I like this short answer. Some of the others were too long. – MarkHu Aug 4 '17 at 1:32 If you want to assign a value unless variable is empty use this: [ -z "$variable" ] && variable="defaultValue"


You can put as well, each other condition on the []

• Variable expansion is meant to handle this as follow : ${variable:='defaultValue'} – Stphane Apr 20 '16 at 12:53 another way case "$variable" in
condition ) result=1;;
*) result=0;;
esac
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 1, "mathjax_display_tex": 0, "mathjax_asciimath": 1, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0, "katex": 0, "math-container": 0, "wp-katex-eq": 0, "align": 0, "equation": 0, "x-ck12": 0, "texerror": 0, "math_score": 0.2707887589931488, "perplexity": 3469.5642734601547}, "config": {"markdown_headings": true, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "plain"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "warc_path": "s3://commoncrawl/crawl-data/CC-MAIN-2019-43/segments/1570986664662.15/warc/CC-MAIN-20191016041344-20191016064844-00446.warc.gz"}