≡ Menu

Bash Shell: Find Out If a Variable Is Set or Not

How do I check if a bash shell variable called $input is defined or not under BSD / Apple OS X / Unix / Linux like operating systems?

Method #1: Bash Variable Existence Check

The syntax is as follows to determine if $input is defined or not:

${Variable?Error \$Variable is not defined}

OR

${Variable:?Error \$Variable is not defined}

In this example your script will stop executing if the variable $input is not defined:

input="Foo bar"
echo ${input?Error \$input is not defined.}
unset input
echo ${input?Error \$input is not defined.}

Sample outputs:

Foo bar
bash: input: Error $input is not defined.

In this example, make sure $input is defined and is not empty, enter:

[[  $input && ${input-x} ]] 
input="Foo" 
[[  $input && ${input-x} ]] && echo "Found" || echo "Not found"
unset input
[[  $input && ${input-x} ]] && echo "Found" || echo "Not found"

Here is an example that make sure $_php_map_extension is defined:

        # read config data
        loadConfigData "${_t_domain_php_conf}" $LINENO "${FUNCNAME[0]}"
 
	# make sure it is defined and not empty 
	if [[ $_php_map_extension && ${_php_map_extension-_} ]]
        then
                at=${#_php_map_extension[*]}                                            # get total elements in an array
                s=""
                echo '## Map extension to .php? ##' 
                echo 'fastcgi.map-extensions = ('  
                for (( i=0; i<${at}; i++ ));
                do
                        [ $i -lt $(( $at - 1 )) ] && s="," || s=""                      # remove , for last item in an array                    
                        echo "      \".${_php_map_extension[i]}\" => \".php\"${s}" 
                done
                echo ')'
	else 
		echo "Skiping php map extension as \$_php_map_extension is not defined in /usr/local/etc/nixcraft/conf/php.conf."
        fi

Sample outputs:

Skiping php map extension as $_php_map_extension is not defined in /usr/local/etc/nixcraft/conf/php.conf

OR

## Map extension to .php? ##
fastcgi.map-extensions = (
      ".html" => ".php",
      ".htm" => ".php",
      ".phtml" => ".php",
      ".php3" => ".php",
      ".php4" => ".php"
)

Method #2: isvarset() function

The above examples are useful for a sanity checking. Finally, you can use the following code:

isvarset(){
 local v="$1"
 [[ ! ${!v} && ${!v-unset} ]] && echo "Variable not found." || echo "Variable found."
}
 
# find out if $vech defined or not
vech="Bus" && isvarset vech
vech="" && isvarset vech
unset vech && isvarset vech

Method 3: Using the Length of STRING

The -z option to test command returns TRUE of the Length of STRING is zero. You can use the following syntax:

### set or not???
input="Foo"
[ -z "${input+x}" ] && echo "\$input is not set" || echo "\$input found and is set to \"$input\"."
 
### Not set at ALL
unset input
[ -z "${input+x}" ] && echo "\$input is not set" || echo "\$input found and is set to \"$input\"."
 
### 'set but empty' or not?
input=""
[ -z "$input" -a "${input+x}" = "x" ] && echo "\$input variable is set with empty value." || echo "\$input found and is set to "\$input\""

The above syntax will tell if a variable is defined or not defined or defined with a empty value in a bash shell script.

Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 4 comments… add one }
  • Chris F.A. Johnson October 6, 2011, 2:19 am
    varstatus()
    {
      if [ -n "$1" ]
      then
        echo Set and not empty
      elif [ -n "${1+x}" ]
      then
        echo Set but empty
      else
        echo Not set
      fi
    }
    
    varstatus ''
    varstatus
    varstatus qwerty
    
  • lazarus September 23, 2012, 9:27 pm

    Hi vitek,
    in method 3, last line there’s a typo:
    \”$input\” instead of “\$input\”
    Kind regards
    lazarus

  • Guillermo December 19, 2012, 4:29 pm

    You have an easier way to check if a variable is set or not even if you enable -u (set -u = Treat unset variables as an error when substituting.)

    [ “${var:-NOTDEF}” != “NOTDEF” ] && echo var is defined || echo var is not defined.

    From man bash

    ${parameter:-word}
    Use Default Values. If parameter is unset or null, the expansion of word is
    substituted. Otherwise, the value of parameter is substituted.

  • dj February 14, 2013, 4:12 am

    The bash parameter expansions (:-, :=, :?, :+) are very helpful.
    See Parameter Expansion in the bash man page or read here:
    http://tiswww.case.edu/php/chet/bash/bash.html#lbBB

    But there is an additional option with Bash 4.2. The -v operator:

    snippet:
    test/[/[[ have a new -v variable unary operator, which returns success if `variable’ has been set.

    link (search for -v):
    http://tiswww.case.edu/php/chet/bash/CHANGES
    or read
    http://tiswww.case.edu/php/chet/bash/bash.html#lbBW

Security: Are you a robot or human?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , , , , , , , , , ,