O código a seguir sai com um erro de variável não associada. Como consertar isso, ainda usando a set -o
opção nounset?
#!/bin/bash
set -o nounset
if [ ! -z ${WHATEVER} ];
then echo "yo"
fi
echo "whatever"
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
Nesse caso, VALUE
acaba sendo uma string vazia se WHATEVER
não for configurada. Estamos usando a {parameter:-word}
expansão, que você pode pesquisar em man bash
"Expansão de parâmetros".
:-
verifica se a variável não está definida ou está vazia. Se você quiser verificar a única seja desactivado, usar-
:VALUE=${WHATEVER-}
. Além disso, uma maneira mais legível de verificar se uma variável está vazia:if [ "${WHATEVER+defined}" = defined ]; then echo defined; else echo undefined; fi
$WHATEVER
contiver apenas espaços em branco - veja minha resposta.! -z
" em vez de apenas "-n
"?Você precisa citar as variáveis se quiser obter o resultado esperado:
Teste:
fonte
"info bash"
,"${WHATEVER-}"
deveria ter um":"
(cólon) antes do"-"
(traço) como:"${WHATEVER:-}"
e"${WHATEVER+defined}"
deve ter uma vírgula antes do"+"
(plus) como:"${WHATEVER:+defined}"
. Para mim, funciona de qualquer maneira, com ou sem o cólon. Em algumas versões do 'nix, provavelmente não funcionará sem incluir os dois pontos, então provavelmente deve ser adicionado.-
,+
,:+
, e:-
são todos suportados. O primeiro detecta se a variável está definida e o último detecta se está definida ou vazia . Deman bash
: "Omitindo os dois pontos resulta em um teste apenas para um parâmetro que não está definido."Que tal um oneliner?
-z
verifica se há uma variável vazia ou não definidafonte
-z
verifica apenas se o próximo parâmetro está vazio.-z
é apenas um argumento do[
comando. A expansão variável acontece antes que[ -z
possamos fazer qualquer coisa.Premissas:
Se você quiser que um script não interativo imprima um erro e saia se uma variável for nula ou não configurada:
Se você não quiser que o script saia:
Você pode até usar
[
e em]
vez de[[
e]]
acima, mas o último é preferível no Bash.Observe o que os dois pontos fazem acima. Dos documentos :
Aparentemente, não há necessidade de
-n
ou-z
.Em resumo, normalmente posso apenas usar
[[ "${VAR:?}" ]]
. Pelos exemplos, isso imprime um erro e sai se uma variável for nula ou não configurada.fonte
Você pode usar
mas
pode ser mais legível.
fonte
=
operador padrão (POSIX) , não==
para auxiliar na portabilidade e, se possível , em[
vez disso[[
.set -o nounset
que é específico do bash. Se você colocar um#!/bin/bash
no topo do seu script, é realmente melhor usar as melhorias do bash.Embora este não seja exatamente o caso de uso solicitado acima, descobri que, se você deseja usar
nounset
(ou-u
) o comportamento padrão é o que você deseja: sair do valor diferente de zero com uma mensagem descritiva.Levei tanto tempo para perceber isso que achei que valia a pena postar como uma solução.
Se tudo o que você quiser é ecoar outra coisa ao sair, ou fazer alguma limpeza, você pode usar uma armadilha.
O
:-
operador provavelmente é o que você deseja de outra forma.fonte