¿Cómo probar la validez de una variable de entorno con bash comprobando si existe y es verdadera?

¿Cómo probar la validez de una variable de entorno con bash comprobando si existe y es verdadera?

Estoy buscando una prueba que regrese truesi la variable de entorno está definida y tiene un valor diferente 0a falseo NULL.

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

Nota: bajo ninguna circunstancia bash debe quejarse de que la variable no está definida o tiene un valor extraño, cualquier valor distinto de 0, vacío, falso o no definido se considerará verdadero.

Respuesta1

Una prueba de este tipo no existe como podría ocurrir en un lenguaje de alto nivel como Java o C#, pero es relativamente fácil de construir.

Tres comentarios sobre su pregunta:

1: No trabaja con valores literales "verdaderos"/"falso" en bash; todos los comandos y construcciones condicionales producen unestado de salida, oresultado lógico, que es 0 (verdadero) o distinto de 0 (falso).
Trabaja con esto, no intentes reinventar la rueda.

2: Intente no utilizar nombres de parámetros en mayúsculas a menos que sean variables de entorno; Esta es una convención simple que ayuda a mantener limpio el código.

3: ¿Qué quieres decir exactamente con "NULL"? La cadena literalNULO, ¿un valor vacío o algo más?
Los dos últimos conceptos no existen en bash; aNULOLa variable no estaría configurada, lo cual ya estás comprobando.

La solución más efectiva sería una función que acepte una variable (o parámetro, como los llama bash) y verifique esas condiciones, luego establezca el estado de salida en función de eso, condensando efectivamente múltiples valores de verdad en un literal 0 o 1.

Por ejemplo:

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"da 0, lo cual es cierto
  • is_true "false"da 1, lo cual es falso
  • a=10; is_true "$a"rinde 0
  • grep -q something somefileproduce 0 si somethingaparece al menos una vez en somefile.

TENGA EN CUENTA que el último ejemplo muestra claramente que no NECESITA dicha construcción; todo lo que pasa en bashyafunciona con estos valores de verdad básicos 0/1.

Pero admito que es posible que tengas que convertir la entrada de algún programa externo retorcido :)

Respuesta2

Encuentro que estas comparaciones son inútiles porque hacen que el código parezca oscuro y poco obvio. Solo uso la característica interesante de bash, que viene desde la versión 4.2, de la página de manual:

   -v varname
          True if the shell variable varname is set (has been assigned a value).

El uso es muy simple

OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
    exec > &>./logfile
fi

En otras palabras, para marcar como habilitado, simplemente defina. ¡Intentalo!

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

Respuesta3

Puede realizar las tres comprobaciones con la coincidencia de expresiones regulares (los parámetros no definidos se resuelven en la cadena vacía):

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)

información relacionada