
Estou procurando um teste que retorne true
se a variável de ambiente estiver definida e tiver um valor diferente de 0
, false
ou NULL
.
ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true
if ... do ...
Nota: sob nenhuma circunstância o bash deve reclamar sobre a variável não estar definida ou ter um valor estranho, qualquer coisa diferente de 0, vazio, falso ou não definido seria considerado verdadeiro.
Responder1
Tal teste não existe como poderia existir em uma linguagem de alto nível como Java ou C#, mas é relativamente fácil de construir.
Três comentários sobre sua pergunta conforme solicitado:
1: Você não trabalha com valores literais "true"/"false" no bash; todos os comandos e construções condicionais produzem umstatus de saída, ouresultado lógico, que é 0 (verdadeiro) ou diferente de 0 (falso).
Trabalhe com isso, não tente reinventar a roda.
2: Tente não usar nomes de parâmetros em letras maiúsculas, a menos que sejam variáveis de ambiente; esta é uma convenção simples que ajuda a manter seu código limpo.
3: O que exatamente você quer dizer com "NULL"? A sequência literalNULO, um valor vazio ou algo mais?
Os dois últimos conceitos não existem no bash; aNULOvariável não seria definida, o que você já está verificando.
A solução mais eficaz seria uma função que aceitasse uma variável (ou parâmetro, como o bash os chama) e verificasse essas condições e, em seguida, definisse o status de saída com base nisso, condensando efetivamente vários valores verdade em um literal 0 ou 1.
Por exemplo:
is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }
is_true "1"
produz 0, o que é verdadeis_true "false"
produz 1, o que é falsoa=10; is_true "$a"
produz 0grep -q something somefile
produz 0 sesomething
aparecer pelo menos uma vez emsomefile
.
OBSERVE que o último exemplo mostra claramente que você NÃO PRECISA de tal construção; tudo o que acontece no bashjáfunciona com esses valores verdadeiros básicos de 0/1.
Mas admito que talvez você precise converter a entrada de algum programa externo complicado :)
Responder2
Acho essas comparações inúteis porque tornam a aparência do código obscura e pouco óbvia. Eu apenas uso o recurso interessante do bash, que vem desde a v4.2, na página de manual:
-v varname
True if the shell variable varname is set (has been assigned a value).
O uso é muito simples
OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
exec > &>./logfile
…
fi
Ou seja, para sinalizar como habilitado, basta definir. Tente!
$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && : # no output
$ unset VAR && VAR= && : # "existed"
$ unset VAR && VAR=1 && : # "existed"
Responder3
Você poderia fazer todas as três verificações com correspondência de expressões regulares (parâmetros indefinidos são resolvidos para a string vazia):
is_true() (
shopt -s nocasematch
[[ ! $1 =~ ^(false|0|)$ ]]
)