Cómo usar declaraciones if de Bash con múltiples condiciones

ShellShellBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Este tutorial te introduce en el uso de declaraciones if de Bash con múltiples condiciones para mejorar tus habilidades en la escritura de scripts de shell. Aprenderás cómo combinar operadores lógicos de manera efectiva, lo que te permitirá crear scripts que tomen decisiones inteligentes basadas en varios criterios. Al final de este laboratorio (lab), estarás capacitado para crear herramientas de automatización versátiles para tareas cotidianas.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/AdvancedScriptingConceptsGroup(["Advanced Scripting Concepts"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/cond_expr("Conditional Expressions") shell/AdvancedScriptingConceptsGroup -.-> shell/read_input("Reading Input") shell/SystemInteractionandConfigurationGroup -.-> shell/exit_status_checks("Exit Status Checks") subgraph Lab Skills shell/if_else -.-> lab-413763{{"Cómo usar declaraciones if de Bash con múltiples condiciones"}} shell/cond_expr -.-> lab-413763{{"Cómo usar declaraciones if de Bash con múltiples condiciones"}} shell/read_input -.-> lab-413763{{"Cómo usar declaraciones if de Bash con múltiples condiciones"}} shell/exit_status_checks -.-> lab-413763{{"Cómo usar declaraciones if de Bash con múltiples condiciones"}} end

Comprender los conceptos básicos de las declaraciones if de Bash

Comencemos por los conceptos básicos. En Bash, la declaración if ayuda a tu script a decidir qué hacer en función de si una condición es verdadera o falsa. Esto es especialmente útil cuando necesitas automatizar tareas en tu sistema Ubuntu.

Abre tu terminal en el directorio predeterminado, /home/labex/project. Aquí escribirás todos tus scripts. Para comenzar, crea un archivo de script simple llamado basic_if.sh escribiendo:

touch basic_if.sh

Agrega el siguiente código para verificar si un archivo existe:

#!/bin/bash
if [[ -f "testfile.txt" ]]; then
  echo "The file exists."
else
  echo "The file does not exist."
fi

Este script utiliza [[ -f "testfile.txt" ]] para probar si testfile.txt existe en tu directorio actual. El comando echo mostrará un mensaje dependiendo del resultado.

Para ejecutar el script, hazlo ejecutable:

chmod +x basic_if.sh

Luego ejecútalo:

./basic_if.sh

Como testfile.txt aún no existe, verás "The file does not exist." Vamos a crear el archivo para ver el otro resultado:

touch testfile.txt

Ejecuta el script de nuevo:

./basic_if.sh
basic_if.sh

Ahora, debería mostrar "The file exists." Este paso te introduce a la estructura básica: if, then, else y fi. Los corchetes dobles [[ ]] son una característica moderna de Bash, que hace que las pruebas de condiciones sean más confiables que los corchetes simples.

Agregar múltiples condiciones con AND (&&)

Ahora, hagamos que tu declaración if sea más inteligente al verificar múltiples condiciones a la vez. Utilizarás el operador && (AND), que requiere que todas las condiciones sean verdaderas para que se ejecute el bloque then.

Abre basic_if.sh nuevamente y reemplaza su contenido con este script actualizado:

#!/bin/bash
if [[ -f "testfile.txt" ]] && [[ -r "testfile.txt" ]]; then
  echo "The file exists and is readable."
else
  echo "The file is either missing or not readable."
fi

Este script verifica dos cosas: si testfile.txt existe (-f) y si es legible (-r). Ambos deben ser verdaderos para que aparezca el primer mensaje.

Ejecuta el script:

./basic_if.sh

Como creaste testfile.txt en el Paso 1 y es legible por defecto (ya que labex es su propietario), verás "The file exists and is readable." Para entender cómo funciona &&, probemos el escenario opuesto. Cambia los permisos del archivo para que no sea legible:

chmod u-r testfile.txt

Ejecuta el script de nuevo:

./basic_if.sh

Ahora, muestra "The file is either missing or not readable" porque la segunda condición (-r) falla. Restaura la legibilidad para los siguientes pasos:

chmod u+r testfile.txt

El operador && asegura que todas las condiciones deben cumplirse, lo cual es perfecto para situaciones en las que importan múltiples criterios.

Usar OR (||) para condiciones flexibles

A continuación, explorarás el operador || (OR), que permite que el bloque then se ejecute si al menos una condición es verdadera. Esto es útil cuando deseas flexibilidad en tus comprobaciones.

Abre basic_if.sh nuevamente. Actualízalo con este código:

#!/bin/bash
if [[ -f "testfile.txt" ]] || [[ -f "backup.txt" ]]; then
  echo "At least one file exists."
else
  echo "Neither file exists."
fi

Este script comprueba si existe testfile.txt o backup.txt. Dado que testfile.txt ya está en tu directorio, ejecútalo:

./basic_if.sh

Verás "At least one file exists." Ahora, elimina testfile.txt para probar la lógica ||:

rm testfile.txt

Ejecuta el script de nuevo:

./basic_if.sh

Muestra "Neither file exists" porque no está presente ningún archivo. Crea backup.txt para ver que se cumpla la condición OR:

touch backup.txt
./basic_if.sh

Ahora, dice de nuevo "At least one file exists". El operador || es excelente cuando basta con que una de las condiciones sea verdadera.

Combinar operadores AND y OR

Vamos a combinar && y || para una lógica más compleja. Verificarás si un archivo existe y cumple con criterios específicos, con una condición alternativa.

Abre basic_if.sh nuevamente. Actualízalo con este código:

#!/bin/bash
if [[ -f "testfile.txt" ]] && [[ -r "testfile.txt" ]] || [[ -f "backup.txt" ]]; then
  echo "Either testfile.txt is readable or backup.txt exists."
else
  echo "No suitable file found."
fi

Este script comprueba si testfile.txt existe y es legible, o si backup.txt existe. Vuelve a crear testfile.txt:

touch testfile.txt

Ejecuta el script:

./basic_if.sh

Muestra "Either testfile.txt is readable or backup.txt exists" porque testfile.txt cumple con ambas condiciones. Elimina testfile.txt y mantén backup.txt:

rm testfile.txt
./basic_if.sh

Aparece el mismo mensaje porque backup.txt satisface la condición ||. Elimina también backup.txt:

rm backup.txt
./basic_if.sh

Ahora, dice "No suitable file found." Este paso muestra cómo mezclar operadores para tomar decisiones más matizadas.

Aplicar condiciones a una tarea práctica

Finalmente, usemos lo que has aprendido en un escenario del mundo real: validar la entrada del usuario. Escribirás un script para verificar si un número está dentro de un rango.

Crea un nuevo script llamado number_check.sh:

touch number_check.sh
chmod +x number_check.sh

Agrega este código:

#!/bin/bash
read -p "Enter a number between 1 and 10: " number
if [[ "$number" -ge 1 ]] && [[ "$number" -le 10 ]]; then
  echo "Valid number: $number"
else
  echo "Invalid number. Please enter a value between 1 and 10."
fi

Este script te pide que ingreses un número y luego usa && para asegurarse de que esté entre 1 y 10 (incluidos). Ejecútalo:

./number_check.sh

Escribe 5 y presiona Enter. Verás "Valid number: 5". Ejecútalo de nuevo e ingresa 15. Responderá con "Invalid number. Please enter a value between 1 and 10." Esta es una forma práctica de manejar la entrada del usuario, asegurando que tu script solo continúe con datos válidos.

Resumen

En este laboratorio, has dominado las declaraciones if de Bash con múltiples condiciones utilizando los operadores && y ||. Desde verificar propiedades de archivos hasta validar la entrada del usuario, has creado scripts que toman decisiones basadas en criterios complejos. Estas habilidades te permiten crear herramientas de automatización confiables adaptadas a diversas necesidades en tu sistema Ubuntu.