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
.