Depende do que você quer dizer com existe .
Será uma variável que foi declarada, mas não atribuído existir ?
Será uma variável de matriz (ou de hash) que foi atribuída uma lista vazia existir ?
Será uma variável que aponta nameref a uma variável que não está actualmente atribuído existir ?
Você considera $-, $#, $1variáveis? (POSIX não).
Nas conchas tipo Bourne, o caminho canônico é:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
Que trabalha para variáveis escalares e outros parâmetros de dizer se uma variável tem sido atribuído um valor (vazio ou não, automaticamente, a partir do ambiente, assigments, read, forou outras).
Para os reservatórios que têm um typesetou declarecomando, que não iria relatar como definir as variáveis que foram declaradas , mas não atribuídos exceto em zsh.
Para shells que suportam matrizes, exceto yashe zshque não reportariam como variáveis de matriz definidas , a menos que o elemento do índice 0 tenha sido definido.
Para bash(mas não ksh93nem zsh), para variáveis do tipo matriz associativa , que não as reportariam como definidas, a menos que seu elemento da chave "0" tenha sido definido.
Para ksh93e bash, para variáveis do tipo nameref , isso só retornará true se a variável referenciada pelo nameref for considerada configurada .
Para ksh, zshe bash, uma abordagem potencialmente melhor poderia 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, zshe bash4.4 ou acima, há também:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
Que reportará variáveis que foram definidas ou declaradas.
$somevarpara um valor / string se a variável não existe:${somevar:=42}.