
Estoy buscando una prueba que regrese true
si la variable de entorno está definida y tiene un valor diferente 0
a false
o 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 ciertois_true "false"
da 1, lo cual es falsoa=10; is_true "$a"
rinde 0grep -q something somefile
produce 0 sisomething
aparece al menos una vez ensomefile
.
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|)$ ]]
)