Portátil para todos os invólucros POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Faça isso ${foobar:+1}se quiser tratar foobarda mesma maneira, esteja vazio ou não definido. Você também pode usar ${foobar-}para obter uma sequência vazia quando foobarindefinida e o valor de foobaroutra forma (ou colocar qualquer outro valor padrão depois da -).
Em ksh, se foobarfor declarado, mas não definido, como em typeset -a foobar, será ${foobar+1}expandido para a sequência vazia.
O Zsh não possui variáveis declaradas, mas não definidas: typeset -a foobarcria uma matriz vazia.
No bash, as matrizes se comportam de uma maneira diferente e surpreendente. ${a+1}somente se expande para 1se afor uma matriz não vazia, 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 de matriz são tratadas como definidas se tiverem um conjunto de índices não vazio.
Uma maneira diferente e específica do bash de testar se uma variável de qualquer tipo foi definida é verificar se ela está listada . Isso relata matrizes vazias conforme definido, diferentemente , mas relata variáveis declaradas mas não atribuídas ( ) como indefinidas.${!PREFIX*}${foobar+1}unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Isso é equivalente a testar o valor de retorno de typeset -p foobarordeclare -p foobar , exceto que typeset -p foobarfalha em variáveis declaradas, mas não atribuídas.
No bash, como no ksh, set -o nounset; typeset -a foobar; echo $foobardispara 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, se ${foobar+1}expande para a cadeia vazia se e somente se $foobarcausaria um erro em set -o nounset.
-vnão é uma opçãotest, mas um operador para expressões condicionais.