<<- home <<- thoughts
TRUTH(7m) 7m (r-x) TRUTH(7m)

truth tableswhat exactly is “true” in bash?

Specifically, in what cases can you use an abbreviated conditional like the following:

declare var=$( ... )
if [[ $var ]] ; then ... ; fi

This test is roughly equivalent to the more common ‘[[ -n $var ]]’. Often it is necessary to differentiate between a variable that's unset vs. empty.

This code uses some sneaky parameter expansion to test different scenarios.

# Set, empty.
declare -- se=

# Set, non-empty.
declare -- ne='set'

# Non-set
#declare -- ns

#    TEST                          #      SET      VALUE     RESULT
#---------------------------------------------------------------------
[[ ${ne}     ]] && echo  "ne"      #      YES       YES      TRUE
[[ ${se}     ]] && echo  "se"      #      YES        NO      FALSE
[[ ${ns}     ]] && echo  "ns"      #       NO       ---      FALSE

[[ ${ne-_}   ]] && echo  "ne-_"    #      YES       YES      TRUE
[[ ${se-_}   ]] && echo  "se-_"    #      YES        NO      FALSE
[[ ${ns-_}   ]] && echo  "ns-_"    #       NO       ---      TRUE

[[ ${ne:-_}  ]] && echo  "ne:-_"   #      YES       YES      TRUE
[[ ${se:-_}  ]] && echo  "se:-_"   #      YES        NO      TRUE
[[ ${ns:-_}  ]] && echo  "ns:-_"   #       NO       ---      TRUE

[[ ${ne+_}   ]] && echo  "ne+_"    #      YES       YES      TRUE
[[ ${se+_}   ]] && echo  "se+_"    #      YES        NO      TRUE
[[ ${ns+_}   ]] && echo  "ns+_"    #       NO       ---      FALSE

[[ ${ne:+_}  ]] && echo  "ne:+_"   #      YES       YES      TRUE
[[ ${se:+_}  ]] && echo  "se:+_"   #      YES        NO      FALSE
[[ ${ns:+_}  ]] && echo  "ns:+_"   #       NO       ---      FALSE

To test if a variable is...

...unset
[[ ! ${var+_} ]]

...set but empty
[[ ! ${var-_} ]]

...set and nonempty
[[ ${var} ]]

January 16, 2025 carlinigraphy