Respostas:
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
Nesse caso, VALUEacaba sendo uma string vazia se WHATEVERnã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
$WHATEVERcontiver 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:
check() {
if [ -n "${WHATEVER-}" ]
then
echo 'not empty'
elif [ "${WHATEVER+defined}" = defined ]
then
echo 'empty but defined'
else
echo 'unset'
fi
}
Teste:
$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER=' '
$ check
not empty
"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 . De man bash: "Omitindo os dois pontos resulta em um teste apenas para um parâmetro que não está definido."
Que tal um oneliner?
[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"
-z verifica se há uma variável vazia ou não definida
-zverifica apenas se o próximo parâmetro está vazio. -zé apenas um argumento do [comando. A expansão variável acontece antes que [ -zpossamos fazer qualquer coisa.
Premissas:
$ echo $SHELL
/bin/bash
$ /bin/bash --version | head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ set -o nounset
Se você quiser que um script não interativo imprima um erro e saia se uma variável for nula ou não configurada:
$ [[ "${HOME:?}" ]]
$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set
$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set
Se você não quiser que o script saia:
$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."
$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.
$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.
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 :
Em outras palavras, se os dois pontos forem incluídos, o operador testa a existência de ambos os parâmetros e se seu valor não é nulo; se os dois pontos forem omitidos, o operador testa apenas a existência.
Aparentemente, não há necessidade de -nou -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.
Você pode usar
if [[ ${WHATEVER:+$WHATEVER} ]]; then
mas
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
pode ser mais legível.
=operador padrão (POSIX) , não ==para auxiliar na portabilidade e, se possível , em [vez disso [[.
set -o nounsetque é específico do bash. Se você colocar um #!/bin/bashno 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 usarnounset (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.