Portátil para todos os shells do POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Faça o ${foobar:+1} se você quiser tratar foobar da mesma maneira, esteja vazio ou não definido. Você também pode usar ${foobar-} para obter uma string vazia quando foobar for indefinido e o valor de foobar (ou colocar qualquer outro valor padrão após o - ).
Em ksh, se foobar for declarado mas não definido, como em typeset -a foobar , então ${foobar+1} se expandirá para a string vazia.
O Zsh não possui variáveis declaradas, mas não configuradas: typeset -a foobar cria uma matriz vazia.
No bash, os arrays se comportam de maneira diferente e surpreendente. ${a+1} apenas se expande para 1 se a for um array não vazio, por exemplo
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
O mesmo princípio se aplica a matrizes associativas: variáveis matriciais são tratadas como definidas se tiverem um conjunto não vazio de índices.
Uma maneira diferente e específica para testar se uma variável de qualquer tipo foi definida é verificar se ela está listada em ${!PREFIX*} . Isso informa matrizes vazias conforme definido, ao contrário de ${foobar+1} , mas relata variáveis declaradas, mas não atribuídas ( unset foobar; typeset -a foobar ) como indefinidas.
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Isso equivale a testar o valor de retorno de typeset -p foobar ou declare -p foobar , exceto que typeset -p foobar falha em variáveis declaradas, mas não atribuídas.
No bash, como em ksh, set -o nounset; typeset -a foobar; echo $foobar dispara um erro na tentativa de expandir a variável indefinida foobar . Ao contrário do ksh, set -o nounset; foobar=(); echo $foobar (ou echo "${foobar[@]}" ) também dispara um erro.
Observe que, em todas as situações descritas aqui, ${foobar+1} se expande para a string vazia se, e somente se, $foobar causar um erro em set -o nounset .