HOWTO · Bash
Declarar y utilizar booleanos en Bash
Este tutorial demuestra la declaración y utilización de booleanos en Bash.
En esta página
Bash no tiene un tipo de variable booleano propio. Para representar una elección, puedes usar directamente el estado de éxito o fallo de un comando, o adoptar una convención de valores, como 1 para habilitado y 0 para deshabilitado. Son conceptos distintos: un estado de salida 0 significa éxito, mientras que uno distinto de cero significa fallo. Los ejemplos siguientes muestran cómo usar ambas formas sin tratar el contenido arbitrario de una variable como si fuera un comando.
Valores booleanos y estados de salida en Bash
Los comandos true y false indican éxito y fallo, respectivamente. Una instrucción if evalúa su estado de salida; son comandos, no valores especiales almacenados en variables. Un script también puede usar una bandera entera documentada cuando necesite almacenar un valor o pasarlo como argumento.
Usar true y false en condiciones
Usa un comando directamente como condición cuando quieras comprobar si tuvo éxito o falló. Así, Bash puede tomar una decisión según el estado de salida del comando.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
if true; then
printf '%s\n' 'The command succeeded.'
fi
if false; then
printf '%s\n' 'This branch is skipped.'
else
printf '%s\n' 'The command reported failure.'
fi
Evita escribir if $value; then para comprobar una variable. Bash intentaría ejecutar el contenido de la variable como un comando. En su lugar, compara un valor conocido o usa una expresión de prueba.
Representar estados similares a booleanos en variables
Una bandera entera es una convención de la aplicación, así que elige y documenta qué representa cada valor. Este ejemplo usa 1 para habilitado y 0 para deshabilitado. Las condiciones aritméticas la comparan numéricamente, sin confundirla con el estado de salida de un comando.
Ejecuta este ejemplo de Bash para comprobar numéricamente la bandera habilitada, pasarla a una función y usarla para controlar la salida de un bucle.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
enabled=1
if (( enabled == 1 )); then
printf '%s\n' 'Feature is enabled.'
else
printf '%s\n' 'Feature is disabled.'
fi
report_feature() {
local flag=$1
if (( flag == 1 )); then
printf '%s\n' 'Function received an enabled flag.'
else
printf '%s\n' 'Function received a disabled flag.'
fi
}
report_feature "$enabled"
for item in alpha beta; do
if (( enabled == 1 )); then
printf 'Processing %s.\n' "$item"
fi
done
Feature is enabled.
Function received an enabled flag.
Processing alpha.
Processing beta.
Para comprobar archivos, usa la expresión de prueba adecuada. Entre corchetes simples ([), pon entre comillas las expansiones para que un valor ausente o que contenga espacios no altere los argumentos de la prueba. Para condiciones específicas de Bash, usa [[ ... ]] o sintaxis aritmética.
Combinar condiciones con operadores lógicos
&& ejecuta el comando de la derecha solo si el comando de la izquierda tiene éxito. || ejecuta el de la derecha cuando falla el de la izquierda. Por tanto, ambos operadores usan el estado de salida del comando, donde cero significa éxito. Usa paréntesis o instrucciones if separadas cuando, de otro modo, la agrupación deseada resulte difícil de leer.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
is_logged_in=1
is_admin=0
if (( is_logged_in == 1 && is_admin == 1 )); then
printf '%s\n' 'Access granted.'
else
printf '%s\n' 'Access denied.'
fi
config_file=/etc/example.conf
if [[ -f "$config_file" ]] && printf '%s\n' 'Configuration file exists.'; then
:
fi
La primera condición combina dos banderas enteras. La segunda comprueba si existe un archivo antes de imprimir el mensaje; [[ -f ... ]] es una expresión condicional de Bash, no un comando que produzca una variable booleana.
Usar banderas en funciones y bucles
Pasa una bandera definida explícitamente como argumento entre comillas a una función y compárala usando la misma convención. Un bucle puede leer o actualizar ese estado para decidir si continúa. Define claramente la condición de salida para evitar que el bucle se ejecute indefinidamente.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
keep_running=1
step=0
while (( keep_running == 1 )); do
(( step += 1 ))
printf 'Step %d.\n' "$step"
if (( step >= 3 )); then
keep_running=0
fi
done
Los comandos aritméticos devuelven un estado según el valor de la expresión. Aquí, el incremento es positivo y la condición del bucle usa la bandera almacenada para detenerse cuando el contador llega a tres.
Errores habituales con valores booleanos en Bash
- No des por sentado que Bash trata
0como true y1como false. Esa equivalencia es una convención que defines tú; el estado de salida de un comando de shell usa cero para indicar éxito y cualquier valor distinto de cero para indicar fallo. - No expandas una variable arbitraria como si fuera un comando para averiguar si es true. Compara su valor o usa una expresión condicional.
- Pon entre comillas las expansiones de variables en las pruebas con corchetes simples, como en
[ "$name" = "ready" ]. Para números, usa(( number == 1 ))o pon entre comillas los operandos de una prueba numérica. - Recuerda que
&&y||responden al éxito del comando, no a palabras como true y false almacenadas en una variable.
Elige una convención para las banderas, úsala de forma coherente en las asignaciones y comparaciones, y recurre al estado de salida de un comando cuando necesites comprobar si una operación tuvo éxito.