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

4

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, vazia, falsa ou não definida seria considerada verdadeira.

    
por sorin 29.08.2012 / 13:31

3 respostas

3

Esse teste não existe como 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 um status de saída ou resultado lógico , que é 0 (verdadeiro) ou não 0 (falso).
Trabalhe com isso, não tente reinventar a roda.

2: tente não usar nomes de parâmetros maiúsculos, a menos que sejam variáveis de ambiente; Essa é uma convenção simples que ajuda a manter seu código limpo.

3: O que, exatamente, você quer dizer com "NULL"? A cadeia literal NULL , um valor vazio ou outra coisa?
Os dois últimos conceitos não existem no bash; uma variável NULL não seria definida, o que você já está verificando.

A solução mais eficaz seria uma função que aceita uma variável (ou parâmetro, como o bash as chama), e verifica essas condições, em seguida, define o status de saída com base nisso, condensando efetivamente vários valores de 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" rende 0, o que é verdadeiro
  • is_true "false" rende 1, o que é falso
  • a=10; is_true "$a" rende 0
  • grep -q something somefile rende 0 se something aparecer 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 bash funciona com estes valores de verdade 0/1 básicos.

Mas eu vou admitir que você pode ter que converter a entrada de algum programa externo deformado:)

    
por 29.08.2012 / 14:25
2
Eu acho essas comparações inúteis porque fazem a aparência do código obscuro e não óbvio. Eu apenas uso o bom recurso do bash, que vem desde a v4.2, da manpage:

   -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

Em outras palavras, para marcar como ativado, basta definir. Experimente!

$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && :          # no output
$ unset VAR && VAR= && :  # "existed"
$ unset VAR && VAR=1 && : # "existed"
    
por 05.02.2013 / 20:36
0

Você pode fazer todas as três verificações com correspondência de expressão regular (parâmetros indefinidos resolvidos para a string vazia):

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)
    
por 29.08.2012 / 16:15

Tags