Sentencias Condicionales en Shell

LinuxBeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, aprenderás a utilizar sentencias condicionales en la programación de shell para tomar decisiones lógicas. Cubriremos la sintaxis básica de las sentencias if-else, así como el uso de comparaciones numéricas y de cadenas para evaluar condiciones. Al finalizar esta sesión, estarás capacitado para escribir scripts de shell que puedan tomar decisiones basadas en diversas condiciones.

Esta es una Práctica Guiada (Guided Lab), que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que esta es una práctica de nivel principiante con una tasa de finalización del 97%. Ha recibido una tasa de valoraciones positivas del 100% por parte de los alumnos.

Crea tu primera sentencia If

Comencemos creando una sentencia if sencilla que verifique si una variable llamada NAME es igual a "John".

Primero, abre una terminal en el WebIDE. Por defecto, deberías estar en el directorio /home/labex/project. Si no estás seguro, siempre puedes verificar tu ubicación actual con el comando pwd.

Crea un nuevo archivo llamado if.sh usando el siguiente comando:

touch if.sh

Este comando crea un archivo vacío llamado if.sh en tu directorio actual.

Ahora, abre el archivo if.sh en el WebIDE. Puedes hacerlo haciendo clic en el archivo dentro del explorador de archivos en el lado izquierdo de la interfaz.

Añade el siguiente contenido al archivo:

#!/bin/bash

NAME="John"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
fi

Analicemos este script:

  1. #!/bin/bash: Esto se conoce como línea "shebang". Indica al sistema qué intérprete debe usar para ejecutar el script. En este caso, estamos usando Bash.
  2. NAME="John": Esta línea crea una variable llamada NAME y le asigna el valor "John".
  3. if [ "$NAME" = "John" ]; then: Este es el inicio de nuestra sentencia if. Comprueba si el valor de NAME es igual a "John".
    • Los corchetes [ ] son en realidad un comando en Bash, equivalente al comando test.
    • Ponemos "$NAME" entre comillas para manejar casos donde NAME podría estar vacío o contener espacios.
    • El punto y coma y la palabra then son parte de la sintaxis de la sentencia if en Bash.
  4. echo "The name is John": Esta línea se ejecutará si la condición es verdadera.
  5. fi: Esto marca el final de la sentencia if. ¡Es "if" escrito al revés!

Guarda el archivo después de añadir este contenido.

Ahora, necesitamos hacer que el script sea ejecutable. En sistemas tipo Unix, los archivos no son ejecutables por defecto por razones de seguridad. Podemos cambiar esto usando el comando chmod:

chmod +x if.sh

Este comando añade el permiso de ejecución al archivo. El parámetro +x significa "añadir permiso de ejecución".

Ahora, ejecuta el script:

./if.sh

El prefijo ./ le indica a la shell que busque el script en el directorio actual.

Deberías ver la salida: The name is John

Si no ves este resultado, verifica que hayas guardado el archivo con el contenido correcto y que le hayas otorgado permisos de ejecución.

Añade una cláusula Else

Ahora, ampliemos nuestra sentencia if para incluir una cláusula else. Esto nos permite especificar qué debe suceder cuando la condición es falsa.

Abre de nuevo el archivo if.sh en el WebIDE y modifícalo de la siguiente manera:

#!/bin/bash

NAME="Alice"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
else
  echo "The name is not John"
fi

Repasemos los cambios:

  1. Hemos cambiado la variable NAME a "Alice". Esto es para demostrar qué sucede cuando la condición no se cumple.
  2. Hemos añadido una cláusula else. Esta cláusula define lo que debe ocurrir si la condición de la sentencia if es falsa.
  3. Después del else, hemos añadido otro comando echo que se ejecutará si NAME no es "John".

La cláusula else es opcional en las sentencias if, pero resulta muy útil cuando quieres realizar una acción específica en caso de que la condición sea falsa, en lugar de simplemente no hacer nada.

Guarda el archivo con estos cambios.

Ahora, ejecuta el script de nuevo:

./if.sh

En esta ocasión, deberías ver la salida: The name is not John

Esto se debe a que NAME ahora es "Alice", por lo que la condición [ "$NAME" = "John" ] es falsa y se ejecuta el bloque de código dentro del else.

Intenta cambiar la variable NAME de nuevo a "John" y ejecuta el script otra vez. ¿Qué resultado obtienes? Esta es una buena forma de comprobar que tu sentencia if-else funciona correctamente en ambos casos.

Introducción a Elif

A veces, queremos verificar múltiples condiciones. Aquí es donde la cláusula elif (else if) resulta muy práctica. Vamos a modificar nuestro script para manejar varios nombres.

Actualiza el archivo if.sh con el siguiente contenido:

#!/bin/bash

NAME="George"
if [ "$NAME" = "John" ]; then
  echo "John Lennon"
elif [ "$NAME" = "Paul" ]; then
  echo "Paul McCartney"
elif [ "$NAME" = "George" ]; then
  echo "George Harrison"
elif [ "$NAME" = "Ringo" ]; then
  echo "Ringo Starr"
else
  echo "Unknown member"
fi

Analicemos este script:

  1. Comenzamos con NAME="George". Este será el nombre que comprobaremos.
  2. La primera sentencia if verifica si el nombre es "John".
  3. Si no es "John", pasamos a la primera sentencia elif (else if), que comprueba si el nombre es "Paul".
  4. Si no es "Paul", pasamos al siguiente elif, buscando "George".
  5. Si no es "George", buscamos "Ringo".
  6. Si ninguna de estas condiciones es verdadera, llegamos a la cláusula else, que imprimirá "Unknown member".

La cláusula elif te permite evaluar múltiples condiciones en secuencia. Puedes incluir tantas cláusulas elif como necesites. Las condiciones se evalúan en orden, y se ejecutará el bloque de código correspondiente a la primera que resulte verdadera.

Guarda el archivo con estos cambios.

Ahora, ejecuta el script:

./if.sh

Deberías ver la salida: George Harrison

Intenta cambiar la variable NAME a diferentes valores ("John", "Paul", "Ringo" o cualquier otro) y ejecuta el script cada vez. Observa cómo cambia la salida según el valor de NAME.

Comparaciones Numéricas

Los scripts de shell también pueden comparar números. Vamos a crear un nuevo script para demostrar las comparaciones numéricas.

Crea un nuevo archivo llamado numeric.sh:

touch numeric.sh

Abre numeric.sh en el WebIDE y añade el siguiente contenido:

#!/bin/bash

NUMBER=10

if [ $NUMBER -lt 5 ]; then
  echo "The number is less than 5"
elif [ $NUMBER -eq 10 ]; then
  echo "The number is exactly 10"
elif [ $NUMBER -gt 15 ]; then
  echo "The number is greater than 15"
else
  echo "The number is between 5 and 15, but not 10"
fi

Este script introduce operadores de comparación numérica:

  • -lt: menor que (less than)
  • -eq: igual a (equal to)
  • -gt: mayor que (greater than)

También existen otros que puedes utilizar:

  • -le: menor o igual que (less than or equal to)
  • -ge: mayor o igual que (greater than or equal to)
  • -ne: no es igual a (not equal to)

Observa que usamos estos operadores especiales en lugar de símbolos como < o >. Esto se debe a que en Bash, < y > se utilizan para la redirección de entrada/salida, no para comparaciones numéricas.

Ahora, hagamos que el script sea ejecutable y ejecutémoslo:

chmod +x numeric.sh
./numeric.sh

Deberías ver la salida: The number is exactly 10

Intenta cambiar la variable NUMBER a diferentes valores y ejecuta el script de nuevo. Observa cómo cambia el resultado según el valor que establezcas.

Por ejemplo, si cambias NUMBER a 20, deberías obtener "The number is greater than 15". Si lo cambias a 7, deberías obtener "The number is between 5 and 15, but not 10".

Comparaciones de Cadenas y Operadores Lógicos

Por último, exploremos las comparaciones de cadenas y los operadores lógicos. Crea un nuevo archivo llamado string_logic.sh:

touch string_logic.sh

Abre string_logic.sh en el WebIDE y añade el siguiente contenido:

#!/bin/bash

STRING1="hello"
STRING2="world"
NUMBER1=5
NUMBER2=10

if [ "$STRING1" = "hello" ] && [ "$STRING2" = "world" ]; then
  echo "Both strings match"
fi

if [ $NUMBER1 -lt 10 ] || [ $NUMBER2 -gt 5 ]; then
  echo "At least one of the number conditions is true"
fi

if [[ "$STRING1" != "$STRING2" ]]; then
  echo "The strings are different"
fi

if [[ -z "$STRING3" ]]; then
  echo "STRING3 is empty or not set"
fi

Este script demuestra varios conceptos nuevos:

  1. Comparación de igualdad de cadenas (=): Comprueba si dos cadenas son exactamente iguales.
  2. AND lógico (&&): Este operador permite combinar dos condiciones. Ambas deben ser verdaderas para que la expresión completa sea verdadera.
  3. OR lógico (||): Este operador también combina dos condiciones, pero basta con que una sea verdadera para que la expresión completa sea verdadera.
  4. Comparación de desigualdad de cadenas (!=): Comprueba si dos cadenas son diferentes.
  5. Comprobación de cadena vacía (-z): Es verdadero si la cadena está vacía (tiene longitud cero).

Además, nota el uso de corchetes dobles [[ ]] en algunas de las sentencias if. Estas son una versión mejorada de los corchetes simples y son preferibles en scripts de Bash siempre que sea posible. Permiten expresiones más complejas y presentan menos comportamientos inesperados con respecto a la división de palabras y la expansión de rutas.

Haz que el script sea ejecutable y ejecútalo:

chmod +x string_logic.sh
./string_logic.sh

Deberías ver impresas las cuatro sentencias echo, ya que todas las condiciones del script son verdaderas.

Both strings match
At least one of the number conditions is true
The strings are different
STRING3 is empty or not se

Intenta cambiar algunos de los valores (como establecer STRING1 con algo que no sea "hello") y observa cómo afecta a la salida.

Resumen

En esta práctica de laboratorio, has aprendido a utilizar sentencias condicionales en la programación de shell. Has practicado el uso de sentencias if-else, cláusulas elif, comparaciones numéricas, comparaciones de cadenas y operadores lógicos. Estas herramientas te permiten crear scripts de shell más complejos y basados en la toma de decisiones.

Puntos clave aprendidos:

  • La estructura básica de las sentencias if-else en scripts de shell.
  • Cómo usar elif para manejar múltiples condiciones.
  • Operadores de comparación numérica (-lt, -gt, -eq, etc.).
  • Comparación de cadenas y operadores lógicos.
  • La importancia de otorgar permisos de ejecución a los scripts con chmod.

Recuerda que la práctica es fundamental para dominar el scripting en shell. Intenta crear tus propios scripts utilizando estos conceptos de diferentes maneras. A medida que avances, descubrirás que estas sentencias condicionales son esenciales para desarrollar scripts más sofisticados y útiles.