Como testar a validade de uma variável de ambiente com o bash verificando se ela existe e é verdadeira?

Como testar a validade de uma variável de ambiente com o bash verificando se ela existe e é verdadeira?

Estou procurando um teste que retorne truese a variável de ambiente estiver definida e tiver um valor diferente de 0, falseou 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 é verdade
  • is_true "false"produz 1, o que é falso
  • a=10; is_true "$a"produz 0
  • grep -q something somefileproduz 0 se somethingaparecer pelo menos uma vez em somefile.

OBSERVE que o último exemplo mostra claramente que você NÃO PRECISA de tal construção; tudo o que acontece no bashfunciona 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|)$ ]]
)

informação relacionada