Evaluar condiciones múltiples en Shell Script

Aunque la mayoría de las ocasiones que programamos la comprobación de una condición sólo analizamos una condición (si dos cadenas o números son iguales o no, si un número es mayor o no que otro, si existe un directorio o no…) hay otras veces que necesitamos comparar más de una condición, unas veces para comprobar que se cumplen todas las condiciones y otras veces para comprobar que sólo alguna condición es verdadera.

Supongamos que trabajamos en un parque de atracciones y tenemos que hacer un programa que calcule el precio de la entrada, contando con que los menores de 15 años y los mayores de 65 años tienen un descuento del 20%. El resto paga 100 monedas por entrar. Y además, tenemos que hacer un programa que, para garantizar la seguridad de los asistentes, no permitan subir a una determinada atracción a aquellas personas que midan menos de 120 cm. o que pesen más de 130 kg.

En el primer programa tenemos que comprobar si se cumple una condición u otra para aplicar el descuento. Es decir, si la edad es menor de 15 años O es mayor de 65 años, se aplica descuento. En el resto de casos, no. El operador para controlar si se cumple una condición u otra es -o:

#!/bin/bash

for edad in 12 15 18 20 40 67 89
do
    precio=100
    if [ $edad -lt 15 -o $edad -gt 65 ]
    then
        precio=$(($precio - ($precio * 20 / 100)))
    fi
    echo El usuario de $edad años paga $precio monedas.
done

Que nos devuelve:

El usuario de 12 años paga 80 monedas.
El usuario de 15 años paga 100 monedas.
El usuario de 18 años paga 100 monedas.
El usuario de 20 años paga 100 monedas.
El usuario de 40 años paga 100 monedas.
El usuario de 67 años paga 80 monedas.
El usuario de 89 años paga 80 monedas.

Como vemos, gracias a -o, cuando se cumple una condición (el usuario tiene menos de 15 años) o la otra condición (el usuario tiene más de 65), entra en el bloque de código que calcula el precio con descuento. Si no se cumple ninguna de las dos condiciones, el precio se mantiene inmutable.

Veamos cómo opera -a, que obliga a que ambas condiciones sean ciertas para devolver verdadero:

#!/bin/bash

for usuario in 100,200 130,60 160,65 180,80 115,45 185,135
do
    altura=$(echo $usuario | cut -d "," -f 1)
    peso=$(echo $usuario | cut -d "," -f 2)
    if [ $altura -gt 120 -a $peso -lt 130 ]
    then
        echo El usuario que mide $altura cm. y pesa $peso kg. puede subir a la atracción.
    else
        echo El usuario que mide $altura cm. y pesa $peso kg. no puede subir a la atracción por motivos de seguridad.
    fi
done

Que devuelve:

El usuario que mide 100 cm. y pesa 200 kg. no puede subir a la atracción por motivos de seguridad.
El usuario que mide 130 cm. y pesa 60 kg. puede subir a la atracción.
El usuario que mide 160 cm. y pesa 65 kg. puede subir a la atracción.
El usuario que mide 180 cm. y pesa 80 kg. puede subir a la atracción.
El usuario que mide 115 cm. y pesa 45 kg. no puede subir a la atracción por motivos de seguridad.
El usuario que mide 185 cm. y pesa 135 kg. no puede subir a la atracción por motivos de seguridad.

Cuando las dos condiciones (medir más de 120 cm. y pesar menos de 130kg.) son verdaderas, -a devuelve verdadero, por lo que que se ejecuta el primer bloque de código de la estructura if. En caso contrario, se ejecuta el bloque que se encuentra tras else.

Hay dos usuarios que sólo incumplen una condición, el que mide 115 cm. y el que pesa 135 kg., pero como no cumplen las dos condiciones, -a devuelve falso.

Lo mismo ocurre con el que incumple las dos condiciones, el niño que, midiendo 100 cm., pesa 200 kg.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.