Para que los scripts de Shell posean cierta capacidad de decisión, el primer desafío consiste en diferenciar entre distintas circunstancias para determinar qué operación ejecutar. Por ejemplo, cuando el uso del disco supera el 95%, se podría enviar una alerta; si un directorio de respaldo no existe, crearlo automáticamente; o durante la compilación de código fuente, detener la instalación si la configuración falla.
Uso del comando test para evaluaciones
El comando test se emplea mediante dos sintaxis equivalentes:
test expresión_condicional
o bien
[ expresión_condicional ]
Pruebas basadas en archivos
Estas pruebas determinan si una ruta corrseponde a un archivo o directorio, o verifican permisos de acceso. Las opciones comunes son:
-d: verifica si es un directorio.-e: comprueba la existencia de un archivo o directorio.-f: indica si es un archivo regular.-r: evalúa permisos de lectura para el usuario actual.-w: evalúa permisos de escritura.-x: verifica permisos de ejecución.
Comparación numérica
| Operador | Descripción | Ejemplo (evaluar si 10 es mayor que 5) |
|---|---|---|
-eq |
Igual a | [ 10 -eq 5 ] |
-ne |
Distinto de | [ 10 -ne 5 ] |
-gt |
Mayor que | [ 10 -gt 5 ] |
-lt |
Menor que | [ 10 -lt 5 ] |
-ge |
Mayor o igual que | [ 10 -ge 5 ] |
-le |
Menor o igual que | [ 10 -le 5 ] |
Comparación de cadenas
| Operador | Descripción | Ejemplo |
|---|---|---|
= |
Cadenas iguales | [ "$cadena1" = "$cadena2" ] |
!= |
Cadenas diferentes | [ "$cadena1" != "$cadena2" ] |
-z |
Longitud de cadena cero (vacía) | [ -z "$cadena" ] |
-n |
Longitud de cadena no cero | [ -n "$cadena" ] |
Operadores lógicos
| Sintaxis | Descripción | Ejemplo |
|---|---|---|
&& (en [[ ]]) |
Y lógico | [[ $valor -gt 5 && $valor -lt 10 ]] |
|| (en [[ ]]) |
O lógico | [[ $valor -lt 0 || $valor -gt 10 ]] |
-a (en [ ]) |
Y lógico | [ $valor -gt 5 -a $valor -lt 10 ] |
-o (en [ ]) |
O lógico | [ $valor -lt 0 -o $valor -gt 10 ] |
! |
Negación lógica | [ ! -f documento.txt ] |
Estructura if de una sola rama
Esta sintaxis ejecuta un bloque de código únicamente cuando la condición se cumple; de lo contrario, lo omite.
if [ expresión_condicional ]; then
# Código a ejecutar si la condición es verdadera
fi
Ejemplo: Verifciar si un directorio no existe y crearlo en caso necesario.
#!/bin/bash
directorio="/var/tmp/nueva_carpeta"
if [ ! -d $directorio ]; then
mkdir -p $directorio
echo "Directorio $directorio creado exitosamente."
fi
Estructura if de doble rama
Permite ejecutar dos bloques de código distintos según se cumpla o no la condición.
if [ expresión_condicional ]; then
# Código para condición verdadera
else
# Código para condición falsa
fi
Ejemplo: Determinar si un número ingresado es par o impar.
#!/bin/bash
read -p "Ingrese un número entero: " numero
if [ $((numero % 2)) -eq 0 ]; then
echo "El número $numero es par."
else
echo "El número $numero es impar."
fi
Estructura if de múltiples ramas
Evalúa varias condiciones en secuencia y ejecuta el bloque correspondienet a la primera condición verdadera.
if [ condición1 ]; then
# Código si condición1 es verdadera
elif [ condición2 ]; then
# Código si condición2 es verdadera
else
# Código si ninguna condición se cumple
fi
Ejemplo: Clasificar una temperatura según rangos.
#!/bin/bash
read -p "Ingrese la temperatura en °C: " temp
if ! [[ $temp =~ ^-?[0-9]+$ ]]; then
echo "Error: Ingrese un valor numérico."
exit 1
fi
if [ $temp -gt 30 ]; then
echo "Clima: Caluroso."
elif [ $temp -ge 15 ]; then
echo "Clima: Templado."
elif [ $temp -ge 0 ]; then
echo "Clima: Frío."
else
echo "Clima: Bajo cero."
fi
Las declaraciones condicionales en Shell se basan en expresiones evaluadas mediante comandos como test o corchetes. La elección entre if y case depende de la complejidad de las condiciones: if resulta versátil para múltiples tipos de evaluaciones, mientras que case simplifica la comparación contra valores fijos.