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 $-
, $#
, $1
variá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
, for
ou outras).
Para os reservatórios que têm um typeset
ou declare
comando, 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 yash
e zsh
que 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 ksh93
nem 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 ksh93
e bash
, para variáveis do tipo nameref , isso só retornará true se a variável referenciada pelo nameref for considerada configurada .
Para ksh
, zsh
e 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
, zsh
e bash
4.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.
$somevar
para um valor / string se a variável não existe:${somevar:=42}
.