Checking for environment variables
I am trying to check the value of an environment variable and depending on the value do certain things and it works fine as long as the variable is set. When it isn't though I get a whole bunch of errors (as BASH is trying to compare the string I specify with an undefined variable, I guess)
I tried implementing an extra check to prevent it happening but no luck. The block of code I am using is:
#!/bin/bash
if [ -n $TESTVAR ]
then
if [ $TESTVAR == "x" ]
then
echo "foo"
exit
elif [ $TESTVAR == "y" ]
then
echo "bar"
exit
else
echo "baz"
exit
fi
else
echo -e "TESTVAR not set\n"
fi
And this is the output:
$ export TESTVAR=x
$ ./testenv.sh
foo
$ export TESTVAR=y
$ ./testenv.sh
bar
$ export TESTVAR=q
$ ./testenv.sh
baz
$ unset TESTVAR
$ ./testenv.sh
./testenv.sh: line 5: [: ==: unary operator expected
./testenv.sh: line 9: [: ==: unary operator expected
baz
My question is, shouldn't 'unset TESTVAR' nullify it? It doesn't seem to be the case...
Solution 1:
Enclose the variable in double-quotes.
if [ "$TESTVAR" == "foo" ]
if you do that and the variable is empty, the test expands to:
if [ "" == "foo" ]
whereas if you don't quote it, it expands to:
if [ == "foo" ]
which is a syntax error.
Solution 2:
Look at the section titled "Parameter Expansion" you'll find things like:
${parameter:-word}
Use Default Values. If parameter is unset or null, the expan‐ sion of word is substituted. Otherwise, the value of parameter is substituted.