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.
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop











{ 3 comments… read them below or add one }
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 qwertyHi vitek,
in method 3, last line there’s a typo:
\”$input\” instead of “\$input\”
Kind regards
lazarus
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.