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 foobar
da mesma maneira, esteja vazio ou não definido. Você também pode usar ${foobar-}
para obter uma sequência vazia quando foobar
indefinida e o valor de foobar
outra forma (ou colocar qualquer outro valor padrão depois da -
).
Em ksh, se foobar
for 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 foobar
cria uma matriz vazia.
No bash, as matrizes se comportam de uma maneira diferente e surpreendente. ${a+1}
somente se expande para 1
se a
for 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 foobar
ordeclare -p foobar
, exceto que typeset -p foobar
falha em variáveis declaradas, mas não atribuídas.
No bash, como no 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, se ${foobar+1}
expande para a cadeia vazia se e somente se $foobar
causaria um erro em set -o nounset
.
-v
não é uma opçãotest
, mas um operador para expressões condicionais.