Dominando la Lógica Condicional en Bash: IF, ELIF, ELSE y Errores Frecuentes

Estructuras Condicionales en Shell Scripting

La estructura if podemos ampliarla usando la construcción else (en caso contrario) y elif (en caso contrario si…).

Estructura Simple IF…ELSE

La estructura simple de else es la siguiente:

if [ expresión 1 ]; then
    # Realizar si expresión 1 es verdadera
else
    # Realizar si expresión 1 es falsa
fi

Estructura IF…ELIF…ELSE

Una estructura con elif (else if) tiene la siguiente forma:

if [ expresión1 ]; then
    # Realizar si expresión1 es verdadera
elif [ expresión2 ]; then
    # Realizar si expresión1 es falsa, pero expresión2 es verdadera
elif [ expresión3 ]; then
    # Realizar si exp1 y exp2 son falsas, pero expresión3 es verdadera
else
    # Realizar si todas las expresiones anteriores son falsas
fi

Consideraciones Cruciales y Errores Comunes

Hay que tener muchísimo cuidado con los espacios en blanco, y seguramente durante nuestros primeros scripts casi todos los errores vendrán por haberlos usado mal en las estructuras if.

Hay que recordar que los corchetes llevan espacios en blanco tanto a izquierda como a derecha, que el punto y coma sin embargo va pegado al corchete cerrado, y que SIEMPRE hay que poner espacios en blanco en las expresiones.

Ejemplos de Errores Frecuentes

Veamos algunos errores muy comunes, para que no los cometáis:

  1. Error de Espaciado en Corchetes:

    If [3 -eq 5 ]; then

    Resultado: bash: [3: command not found.

    Explicación: Hemos usado [3 en lugar de [ 3. Falta el espacio después del corchete de apertura.

  2. Uso Incorrecto de Operadores de Cadena para Números:

    if [ “Jose” -eq “Jose” ]; then

    Resultado: Bash: [: jose: integer expression expected.

    Explicación: Debíamos haber usado = para comparar cadenas, o -eq para comparar números. En este caso, el intérprete espera una expresión numérica debido al uso de -eq.

  3. Uso Incorrecto de Operadores Numéricos:

    if [ 3 = 4 ]; then

    Explicación: Esto no nos devolverá error, y parece que funciona, pero en realidad no es así. Para comparación numérica, hay que usar -eq.

  4. Uso de Operadores de Redirección en Condicionales:

    if [ 3 > 4 ]; then

    Explicación: El símbolo > es un operador de redirección en Bash, no un operador de comparación dentro de [ ]. Se debe usar -gt (greater than).

  5. Falta de Espacios en la Condición de Cadena:

    If [ jose=Antonio ]; then

    Explicación: No hemos dejado espacios en la condición =. Esta expresión da como valor verdadero, ya que Bash la interpreta como una única cadena no vacía. Mucho cuidado con este error, que nos puede volver locos en depuración.

Error Común por Variables Nulas

Otro error muy común es el siguiente, causado por un error tipográfico en el nombre de la variable:

#!/bin/bash
PROFESOR=”Juana”
if [ $PROFSOR = “Juana” ]; then
    echo “Hola Juana”
fi

Este programa nos devuelve por pantalla el siguiente error:

bash: [= unary operator expected

Que traducido resulta: me he encontrado un [ (corchete abierto) y luego un operador (el =) sin nada en medio, y eso no funciona.

Revisando el programa anterior, vemos cómo nos hemos equivocado en el nombre de la variable ($PROFSOR en lugar de $PROFESOR), por lo cual $PROFSOR no tiene ningún valor (es nula). Al no valer nada, el programa lo que ve es lo siguiente: if [ = “Juana” ], lo cual es sintácticamente incorrecto.

Operaciones Condicionales Usando test

Hemos visto operadores aritméticos y operadores para cadena, pero en las expresiones podemos utilizar cualquier operación que nos devuelva un valor lógico (0 para verdadero). Por ejemplo, podemos usar la función test del Bash, que funciona de la siguiente forma:

Operadores de Prueba de Ficheros (File Test Operators)

-a fichero
Verdadero si fichero existe.
-d fichero
Verdadero si fichero existe, y es un fichero de tipo directorio.
-f fichero
Verdadero si fichero existe, y es un fichero regular.
-r fichero
Verdadero si fichero existe y se puede leer.
-w fichero
Verdadero si fichero existe y se puede escribir.
-x fichero
Verdadero si fichero existe y se puede ejecutar.
fichero1 -nt fichero2
Verdadero si fichero1 es más nuevo que fichero2.
fichero1 -ot fichero2
Verdadero si fichero1 es más viejo que fichero2.

Anidamiento de Expresiones y Operadores Lógicos

Si lo necesitamos, podemos anidar expresiones usando tanto AND (y, &&) como OR (o, ||).

Operador AND (&&)

if [ expresión1 ] && [ expresión2 ]; then
    # Se ejecuta si expresión1 Y expresión2 son verdaderas
fi

Operador OR (||)

if [ expresión1 ] || [ expresión2 ]; then
    # Se ejecuta si expresión1 O expresión2 son verdaderas
fi

Operador NOT (!)

También podemos usar el operador NOT (!) para indicar una negación.

if ! [ expresión1 ]; then
    # Se ejecuta si expresión1 NO es verdadera
fi

Interacción con el Usuario: El Comando read

Para hacer algunos ejercicios, vamos a aprovechar para explicar mejor cómo le podemos pedir datos al usuario. Se hace con la orden read y es muy simple de usar:

read -p “texto de la pregunta” variable

La ejecución del script se parará, mostrará por pantalla el texto de la pregunta, y dejará que el usuario escriba la respuesta. Cuando pulse INTRO, la respuesta dada se introducirá como valor de variable.

El comando read también puede ser usado sin el parámetro -p, de la forma read variable. También podemos hacer que lea un determinado número de caracteres, sin obligar a que el usuario pulse intro, con el parámetro -n número_de_caracteres. El parámetro -s silencia el eco (no se ve por pantalla lo que el usuario escribe).

Ejemplo Práctico: Determinar Par o Impar

Ahora que sabemos usar el read, hagamos por ejemplo un programa que nos permita indicar si un número introducido es par o impar.

#!/bin/bash
# parimpar.sh - script que nos pide un número e indica si es par o impar.

clear
read -p “Introduzca un número : “ NUMERO

# Usamos 'let' para realizar la operación aritmética de módulo
let RESTO=NUMERO%2

if [ $RESTO -eq 0 ]; then
    echo “El número $NUMERO es par”
else
    echo “El número $NUMERO es impar”
fi

Contexto Académico

TEMA 11 | I.S.O. Linux. Shell Scripts. IMPLANTACIÓN DE SISTEMAS OPERATIVOS. CURSO 2012/2013

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.