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 foobar
la misma manera si está vacío o no está definido. También puede usar ${foobar-}
para obtener una cadena vacía cuando foobar
no está definida y el valor de lo foobar
contrario (o poner cualquier otro valor predeterminado después de -
).
En ksh, si foobar
se 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 foobar
crea una matriz vacía.
En bash, las matrices se comportan de una manera diferente y sorprendente. ${a+1}
solo se expande a 1
si a
es 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 foobar
odeclare -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 $foobar
desencadena 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 $foobar
causaría un error debajo set -o nounset
.
-v
no es una opcióntest
, sino un operador para expresiones condicionales.