if con Bash

Estructura de control if para Linux

La estructura de control if se utiliza para tomar decisiones basadas en condiciones. Permite que nuestro flujo de código vaya en una dirección u otra, dependiendo de las decisiones que se vayan tomando.

Para poder tomar decisiones basadas en una condición, debemos hacer una evaluación condicional.

if [ condición ]; then
    # Código que se ejecuta si se cumple la condición
elif [ otra condición ]; then
    # Código que se ejecuta si se cumple esta otra condición
else
    # Código que se ejecuta si las condiciones son falsas
fi

Podríamos trabajar también con dobles corchetes, aunque no los tendremos en cuenta para esta entrada ya que no todos los shells de Unix son compatibles.

Para que se pueda entender mejor la estructura if y funcionamiento en Bash vamos a trabajar con scripts. Al primero lo llamaremos estructura_if.sh.

Antes de escribir nuestros scripts de ejemplo vamos a ir viendo cómo podemos construir las condiciones.

Comparaciones numéricas con Bash

  • -eq: Igual a (equal).
  • -ne: diferente de (not equal).
  • -gt: mayor que (greater than).
  • -lt: Menor que (less than).
  • -ge: Mayor o igual que (greater than or equal).
  • -le: Menor o igual que (less than or equal).

En este ejemplo realizaremos una comparación de números, en caso de cumplirse el condicional realizaremos una acción, en caso de que esa condición sea falsa realizaremos otra diferente.

Para esto haremos uso de las variables con Bash y del comando ls (con opciones y sin ellas).

Que se cumpla o no la condición de nuestro ejemplo depende de si cuando llamemos a nuestro archivo le pasamos como primer argumento el número 100 o no. Si se cumple la condición muestra un tipo de listado, si no se cumple mostrará otro.

#!/bin/bash

numero=$1

if [ $numero -eq 100 ]; then
    ls -l
else
    ls
fi

La comparación que estamos realizando es numérica, haciendo uso del -eq (igual a) comparamos nuestra variable especial $1 (que recibe el primer argumento) con 100.

  • La variable numero recibe el valor del primer argumento.
  • La comparación que decide qué camino debe tomar nuestro código es si el valor de $numero es igual a 100.
  • Si el valor que tiene $numero, es decir, el primer argumento que hemos pasado llamando a nuestro script es igual a 100 realizamos un listado del tipo ls -l.
  • En caso de no cumplirse la condición porque el valor enviado como argumento no es igual a 100, realizamos un listado normal.

En esta captura de pantalla se puede observar el resultado de que se cumpla la condición (enviando 100) y de que no se cumpla (enviando 400).

Estructura if con bash

No podemos olvidar dar permisos de ejecución con chmod a nuestro programa recién creado.

Comprobaciones de texto con Bash

Vamos a realizar algunas comprobaciones de texto en nuestra estructura if. Introduciremos como primer argumento una palabra y basaremos la respuesta en su valor.

  • ==: si queremos que la comparación sea igual.
  • !=: si queremos que la comparación sea desigual.
#!/bin/bash

valor=$1
if [ $valor == "hola" ]; then
    echo "Gracias por saludar!"
else
    echo "Tutorial sobre la estructura if"
fi

Comprobaciones de archivos con Bash

  • -f: verifica si un archivo existe y es regular (no un directorio).
  • -d: verifica si un directorio existe.
  • -e: verifica si un archivo o directorio existe.
  • -r: verifica si un archivo tiene permiso de lectura.
  • -w: verifica si un archivo tiene permiso de escritura.
  • -x: verifica si un archivo tiene permiso de ejecución.

En este ejemplo sencillo verificaremos con -f la existencia de un archivo llamado «hola.txt» en nuestro directorio.

#!/bin/bash

if [ -f "hola.txt" ]; then
    echo "el archivo existe"
else
    echo "el archivo no existe"
fi

En este pequeño ejemplo verificamos si un directorio no existe (haciendo uso de ! -d «mi_directorio»), si no existe lo creamos haciendo uso del comando mkdir de Linux.

#!/bin/bash

if [ ! -d "mi_directorio" ];then
    mkdir mi_directorio
fi

Con una pequeña modificación verificaremos -w si el mismo archivo «hola.txt» tiene permiso de escritura o no lo tiene.

#!/bin/bash

if [ -w "hola.txt" ]; then
    echo "Tiene permiso de escritura"
else
    echo "No tiene permiso de escritura"
fi

En la siguiente captura de pantalla podemos observar lo siguiente:

  • Realizando un listado ls -l *.txt vemos que nuestro archivo hola.txt no dispone de permisos de escritura.
  • Ejecutamos el archivo con el if recién creado y detecta que no tiene permisos de escritura con la comparación -w «hola.txt».
  • Agregamos permisos de escritura haciendo uso de chmod u+w hola.txt.
  • Volvemos a ejecutar nuestro archivo y la estructura if detecta que ya sí tenemos permisos de escritura.
Estructura if con bash

Condiciones compuestas and y or

Las condiciones compuestas permiten que sean varias condiciones las que decidan qué rumbo toma nuestro script.

  • &&: operador lógico AND, deben cumplirse las dos condiciones.
  • ||: operador lógico OR, debe cumplirse al menos una de las condiciones.

Vamos a ver otro ejemplo en el que se tendrán que cumplir dos condiciones haciendo uso del operador && (AND).

#!/bin/bash

if [ -f "hola.txt" ] && [ -w "hola.txt" ]; then
    echo "Existe y tiene permiso de escritura"
else
    echo "No cumple con las dos condiciones"
fi
Estructura if con bash

Estructura if directamente en la terminal

Vamos a ver un ejemplo básico del uso de la estructura if de Linux directamente desde la terminal, sin necesidad de crear un script .sh.

El primer comando es para darle valor a la variable numero, separado por un punto y coma ; escribimos la estructura if.

numero=1; [ $numero -gt 10 ] && echo "Es mayor" || echo "Es menor o igual"
numero=11; [ $numero -gt 10 ] && echo "El número es mayor de 10" || echo "El número es menor o igual de 10"

Aquí otro ejemplo por si queremos hacer uso de elif. Variando el valor de número podemos observar que funciona correctamente.

numero=10; if [ $numero -eq 1 ]; then echo "El número es igual a 1"; elif [ $numero -gt 10 ]; then echo "El número es mayor de 10"; else echo "El número es mayor de 1 pero menor de 11"; fi

Dejar un comentario

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