Portátil para todos los proyectiles POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Haga eso ${foobar:+1}si desea tratar de foobarla misma manera si está vacío o no está definido. También puede usar ${foobar-}para obtener una cadena vacía cuando foobarno está definida y el valor de lo foobarcontrario (o poner cualquier otro valor predeterminado después de -).
En ksh, si foobarse declara pero no se define, como en typeset -a foobar, entonces${foobar+1} expande a la cadena vacía.
Zsh no tiene variables declaradas pero no establecidas: typeset -a foobarcrea una matriz vacía.
En bash, las matrices se comportan de una manera diferente y sorprendente. ${a+1}solo se expande a 1si aes una matriz no vacía, por ejemplo
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
El mismo principio se aplica a las matrices asociativas: las variables de matriz se tratan como se define si tienen un conjunto de índices no vacío.
Una forma diferente y específica de bash de probar si se ha definido una variable de cualquier tipo es verificar si está incluida en la lista . Esto informa que las matrices vacías están definidas, a diferencia , pero informa que las variables declaradas pero no asignadas ( ) no están definidas.${!PREFIX*}${foobar+1}unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Esto es equivalente a probar el valor de retorno de typeset -p foobarodeclare -p foobar , excepto quetypeset -p foobar falla en variables declaradas pero no asignadas.
En bash, como en ksh, set -o nounset; typeset -a foobar; echo $foobardesencadena un error en el intento de expandir la variable indefinida foobar. A diferencia de ksh, set -o nounset; foobar=(); echo $foobar(o echo "${foobar[@]}") también desencadena un error.
Tenga en cuenta que en todas las situaciones descritas aquí, se ${foobar+1}expande a la cadena vacía si y solo si $foobarcausaría un error debajo set -o nounset.
-vno es una opcióntest, sino un operador para expresiones condicionales.