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 $-, $#, $1las 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, foru otros).
Para shells que tienen un comando typeseto 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 yashy zshque no se reportarían como variables de matriz establecidas a menos que se haya establecido el elemento del índice 0.
Para bash(pero no ksh93ni 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 ksh93y bash, para variables de tipo nameref , eso solo devuelve verdadero si la variable referenciada por nameref se considera establecida .
Para ksh, zshy 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, zshy bash4.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.
$somevaren un valor / cadena si la variable no existe:${somevar:=42}.