Lógica condicional con if y else

ShellBeginner
Practicar Ahora

Introducción

Imagine que conduce un automóvil utilizando un GPS. El GPS no le proporciona una única lista de instrucciones; reacciona a las condiciones de la carretera. Si hay tráfico, cambia la ruta. Si se pasa de un giro, vuelve a calcularla.

En los scripts, esto se denomina lógica condicional. Sin ella, un script sería solo una lista ciega de comandos. Con ella, el script puede inspeccionar la situación actual y decidir qué hacer a continuación.

Esta es una de las bases de la automatización fiable. Los sistemas reales no siempre se encuentran en el mismo estado, por lo que los buenos scripts deben reaccionar en lugar de hacer suposiciones.

En este laboratorio añadirá un «cerebro» a sus scripts mediante if y else.

Enseñará a su script a:

  1. Comprobar la realidad: verificar que un archivo existe antes de intentar abrirlo.
  2. Tomar decisiones: hacer una cosa si la respuesta es «Sí» y otra si es «No».
  3. Comprobar el identificador: verificar si el usuario tiene permisos de root para ejecutar el script.

Comprobar si existe un archivo

Un buen script actúa como un conductor cuidadoso: mira antes de avanzar. Una de las comprobaciones más habituales en Linux es: «¿Existe este archivo?».

Utilizamos la opción -f (comprobación de archivo) dentro de un bloque if. Piense en if como un guardia de seguridad. Solo deja pasar el código que está dentro si se cumple la condición.

Este es su primer ejemplo real de un script que toma una decisión basándose en el estado del sistema. Es un paso importante: pasa de «ejecutar comandos en orden» a «inspeccionar el entorno y elegir una acción». Gran parte de los scripts de administración se basa exactamente en este patrón.

Primero, vaya a la carpeta del proyecto:

cd ~/project

Cree un script nuevo llamado check_file.sh:

nano check_file.sh

Escriba este código. Comprobaremos si existe data.txt.

#!/bin/bash

FILE="data.txt"

if [ -f "$FILE" ]; then
  echo "$FILE exists."
fi

Descifrado de la lógica:

  • if [ ... ]; then: este es el guardia. Hace una pregunta dentro de los corchetes.
  • -f "$FILE": la pregunta: «¿Es data.txt un archivo real?».
  • echo ...: la acción. Solo se ejecuta si el guardia responde «Sí».
  • fi: significa «finalizar if». Indica a Linux que la sección condicional ha terminado.

La forma con corchetes [ ... ] es la manera habitual de Bash de ejecutar una prueba. En este caso, comprueba una propiedad de un archivo. Linux y Bash ofrecen muchos operadores de prueba de este tipo; aprender a utilizarlos permite que los scripts razonen sobre archivos, cadenas, números y permisos.

Guarde el archivo (Ctrl+O) y salga (Ctrl+X).

Convierta el script en ejecutable:

chmod +x check_file.sh

Prueba 1: el archivo invisible

Ejecute ahora el script:

./check_file.sh

No ocurre nada. No se muestra ningún mensaje.

¿Por qué? Porque data.txt no existe. El guardia respondió «No», por lo que el comando echo se omitió por completo.

Prueba 2: el archivo visible

Ahora, cree el archivo:

touch data.txt

Vuelva a ejecutar el script:

./check_file.sh

Ahora el guardia responde «Sí» y verá:

data.txt exists.

Añadir un bloque else

El silencio resulta confuso. Si un script no hace nada, no sabrá si ha fallado o si simplemente ha terminado. Necesitamos un plan B.

En lógica, esto es una «bifurcación del camino».

  • Ruta A (if): el archivo existe. Bien.
  • Ruta B (else): falta el archivo. Vamos a solucionarlo.

Modifiquemos el script para que cree automáticamente el archivo que falta.

Primero, elimine el archivo de prueba para realizar una comprobación real:

rm data.txt

Abra el script:

nano check_file.sh

Añada el bloque else como se muestra a continuación:

#!/bin/bash

FILE="data.txt"

if [ -f "$FILE" ]; then
  echo "$FILE exists."
else
  echo "$FILE does not exist. Creating it now..."
  touch "$FILE"
fi

La lógica:

Si if es verdadero → ejecute la primera parte.

Si if es falso → ejecute la parte else.

Este tipo de script suele estar más cerca de las operaciones reales que un script que solo muestra información. En lugar de limitarse a informar de que falta algo, corrige la situación. Por eso la lógica condicional es la base de muchos scripts de configuración y mantenimiento.

Guarde el archivo y salga.

Probar la lógica

Ejecute el script. data.txt no existe, por lo que debería seguir la ruta B:

./check_file.sh

Salida:

data.txt does not exist. Creating it now...

Ejecútelo de nuevo inmediatamente. Ahora data.txt existe, por lo que debería seguir la ruta A:

./check_file.sh

Salida:

data.txt exists.

Su script ahora es «idempotente»: una palabra técnica que significa que puede ejecutarlo 100 veces y siempre garantizará el resultado correcto —que el archivo exista— sin bloquearse.

Esta palabra aparece con frecuencia en DevOps. Una acción idempotente puede repetirse de forma segura porque el estado final es más importante que el número de veces que se ejecuta el comando. Esto hace que la automatización sea más fiable, especialmente cuando los trabajos se reintentan.

Comprobar los permisos de root

Algunas puertas de Linux están cerradas. Solo el superusuario (root) tiene la llave. Si intenta ejecutar un script de mantenimiento del sistema como usuario normal, fallará con el mensaje «Permission Denied».

Un script inteligente comprueba su identificador antes de intentar abrir la puerta.

En Linux, cada usuario tiene un número (UID).

  • root siempre tiene el UID 0.
  • Los usuarios normales suelen tener un UID de 1000 o superior.

Escribamos un script que compruebe su identificador.

Cree check_root.sh:

nano check_root.sh

Escriba este código:

#!/bin/bash

if [ "$UID" -eq 0 ]; then
  echo "You are running this script as root."
else
  echo "You are running this script as a regular user."
fi

Descifrado:

  • $UID: la variable que contiene su número de identificador actual.
  • -eq: significa «igual». Utilizamos -eq para los números y = para las palabras.

Este es otro ejemplo de sintaxis de prueba. Al comparar números dentro de [ ... ], Bash utiliza operadores como -eq, -ne, -lt y -gt. Son diferentes de las comparaciones de cadenas porque el shell necesita saber si está comparando palabras o valores numéricos.

Guarde el archivo y salga. Conviértalo en ejecutable:

chmod +x check_root.sh

La prueba

Como ha iniciado sesión como labex, es un usuario normal.

Ejecútelo con normalidad:

./check_root.sh

El script detecta que su identificador no es cero y muestra:

You are running this script as a regular user.

Ahora, tomemos prestada la capa del superusuario mediante sudo:

sudo ./check_root.sh

sudo cambia su identificador a 0 únicamente para este comando. El script lo detecta y responde:

You are running this script as root.

¡Así funcionan los scripts profesionales de instalación: se niegan a ejecutarse si usted no es root!

El objetivo no es exigir permisos de root para todo, sino comprobar los privilegios antes de intentar realizar acciones protegidas. Un script bien escrito falla pronto y muestra una explicación clara, en lugar de ejecutarse parcialmente y producir después errores de permisos confusos.

Resumen

¡Acaba de darles un cerebro a sus scripts!

En este laboratorio ha aprendido:

  1. El guardia (if): hacer preguntas como «¿Existe este archivo?» (-f).
  2. La bifurcación (else): proporcionar un plan alternativo si la respuesta es «No».
  3. La comprobación del identificador: utilizar la comparación numérica (-eq) para verificar los permisos del usuario.

Ahora sus scripts ya no son simples listas de comandos; son programas inteligentes que se adaptan a su entorno.