Respostas:
#!/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:
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
-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:
$ 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 -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.
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 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 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.