Depende de lo que quieres decir con existe .
No una variable que ha sido declarado pero no asignado existe ?
¿Tiene una matriz (o hash) variable que se ha asignado una lista vacía existen ?
No una variable nameref que apunta a una variable que actualmente no se asigna existe ?
¿Se considera $-
, $#
, $1
las variables? (POSIX no).
En conchas tipo Bourne, la forma canónica es:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
Eso funciona para variables escalares y otros parámetros para saber si una variable se le ha asignado un valor (vacía o no, de forma automática, desde el medio ambiente, Traspaso, read
, for
u otros).
Para shells que tienen un comando typeset
o declare
, eso no informaría como conjunto las variables que se han declarado pero no se han asignado, excepto en zsh
.
Para shells que admiten matrices, excepto yash
y zsh
que no se reportarían como variables de matriz establecidas a menos que se haya establecido el elemento del índice 0.
Para bash
(pero no ksh93
ni zsh
), para las variables de tipo de matriz asociativa , eso no se informaría como conjunto a menos que se haya establecido su elemento de clave "0".
Para ksh93
y bash
, para variables de tipo nameref , eso solo devuelve verdadero si la variable referenciada por nameref se considera establecida .
Para ksh
, zsh
y bash
, un enfoque potencialmente mejor podría ser:
if ((${#var[@]})); then
echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi
Para ksh93
, zsh
y bash
4.4 o superior, también hay:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
Que informará las variables que se han establecido o declarado.
$somevar
en un valor / cadena si la variable no existe:${somevar:=42}
.