Declaraciones condicionales en el shell

LinuxLinuxBeginner
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

En este laboratorio, aprenderás cómo utilizar declaraciones condicionales en la programación de shell para tomar decisiones lógicas. Cubriremos la sintaxis básica de las declaraciones if-else, así como cómo utilizar comparaciones numéricas y de cadenas para evaluar condiciones. Al final de este laboratorio, serás capaz de escribir scripts de shell que puedan tomar decisiones basadas en diversas condiciones.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicSystemCommandsGroup -.-> linux/logical("Logic Operations") shell/VariableHandlingGroup -.-> shell/variables_decl("Variable Declaration") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") subgraph Lab Skills linux/echo -.-> lab-388815{{"Declaraciones condicionales en el shell"}} shell/shebang -.-> lab-388815{{"Declaraciones condicionales en el shell"}} shell/comments -.-> lab-388815{{"Declaraciones condicionales en el shell"}} linux/logical -.-> lab-388815{{"Declaraciones condicionales en el shell"}} shell/variables_decl -.-> lab-388815{{"Declaraciones condicionales en el shell"}} shell/variables_usage -.-> lab-388815{{"Declaraciones condicionales en el shell"}} linux/chmod -.-> lab-388815{{"Declaraciones condicionales en el shell"}} linux/cd -.-> lab-388815{{"Declaraciones condicionales en el shell"}} shell/if_else -.-> lab-388815{{"Declaraciones condicionales en el shell"}} end

Crea tu primera declaración if

Comencemos creando una simple declaración if 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 directorio actual con el comando pwd.

Crea un nuevo archivo llamado if.sh utilizando 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 hacer esto haciendo clic en el archivo en el explorador de archivos en el lado izquierdo del WebIDE.

Agrega el siguiente contenido al archivo:

#!/bin/bash

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

Desglosemos este script:

  1. #!/bin/bash: Esto se llama una línea "shebang". Le dice al sistema qué intérprete utilizar para ejecutar el script. En este caso, estamos utilizando 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 declaración if. Verifica si el valor de NAME es igual a "John".
    • Los corchetes cuadrados [ ] son en realidad un comando en Bash, equivalente al comando test.
    • Ponemos "$NAME" entre comillas para manejar casos en los que NAME podría estar vacía o contener espacios.
    • El punto y coma y then son parte de la sintaxis de la declaración 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 declaración if. ¡Es "if" escrito al revés!

Guarda el archivo después de agregar este contenido.

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

chmod +x if.sh

Este comando agrega el permiso de ejecución al archivo. El +x significa "agregar permiso de ejecución".

Ahora, ejecuta el script:

./if.sh

El ./ le dice al shell que busque el script en el directorio actual.

Deberías ver la salida: The name is John

Si no ves esta salida, verifica dos veces que hayas guardado el archivo con el contenido correcto y que lo hayas hecho ejecutable.

Agrega una cláusula else

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

Abre el archivo if.sh en el WebIDE nuevamente 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

Veamos los cambios:

  1. Hemos cambiado la variable NAME a "Alice". Esto es para demostrar qué sucede cuando la condición es falsa.
  2. Hemos agregado una cláusula else. Esta cláusula especifica qué debe suceder si la condición en la declaración if es falsa.
  3. Después de la cláusula else, hemos agregado otro comando echo que se ejecutará si NAME no es "John".

La cláusula else es opcional en las declaraciones if, pero es muy útil cuando quieres hacer algo específico cuando la condición es falsa, en lugar de simplemente no hacer nada.

Guarda el archivo con estos cambios.

Ahora, ejecuta el script nuevamente:

./if.sh

Esta vez, 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 código en el bloque else.

Intenta cambiar la variable NAME de nuevo a "John" y ejecuta el script nuevamente. ¿Qué salida obtienes? Esta es una buena manera de probar que tu declaración if-else está funcionando correctamente en ambos casos.

Introducción al elif

A veces, queremos verificar múltiples condiciones. Aquí es donde la cláusula elif (else if) resulta útil. Modifiquemos nuestro script para manejar múltiples 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

Desglosemos este script:

  1. Comenzamos con NAME="George". Este será el nombre que estemos verificando.
  2. La primera declaración if verifica si el nombre es "John".
  3. Si no es "John", pasamos a la primera declaración elif (else if), que verifica si el nombre es "Paul".
  4. Si no es "Paul", pasamos al siguiente elif, verificando si es "George".
  5. Si no es "George", verificamos si es "Ringo".
  6. Si ninguna de estas condiciones es verdadera, caemos en la cláusula else, que mostrará "Unknown member".

La cláusula elif te permite verificar múltiples condiciones en secuencia. Puedes tener tantas cláusulas elif como necesites. Las condiciones se verifican en orden, y la primera que sea verdadera tendrá su bloque de código correspondiente ejecutado.

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 algo completamente distinto) 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. Creemos 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 agrega 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
  • -eq: igual a
  • -gt: mayor que

También hay otros que puedes usar:

  • -le: menor o igual que
  • -ge: mayor o igual que
  • -ne: distinto de

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 la comparación numérica.

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 nuevamente. Observa cómo cambia la salida 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 agrega 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 (=): Esto verifica si dos cadenas son exactamente iguales.
  2. AND lógico (&&): Este operador te permite combinar dos condiciones. Ambas condiciones deben ser verdaderas para que la expresión general sea verdadera.
  3. OR lógico (||): Este operador también combina dos condiciones, pero solo una necesita ser verdadera para que la expresión general sea verdadera.
  4. Comparación de desigualdad de cadenas (!=): Esto verifica si dos cadenas son diferentes.
  5. Verificar si una cadena está vacía (-z): Esto es verdadero si la cadena está vacía (tiene longitud cero).

También, observa el uso de corchetes dobles [[ ]] en algunas de las declaraciones if. Estos son una versión mejorada de los corchetes simples y se prefieren en los scripts de Bash cuando es posible. Permiten expresiones más complejas y tienen menos sorpresas con respecto a la división de palabras y la expansión de nombres de ruta.

Haz que el script sea ejecutable y ejecútalo:

chmod +x string_logic.sh
./string_logic.sh

Deberías ver imprimidas las cuatro declaraciones echo, porque todas las condiciones en el script son verdaderas.

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

Intenta cambiar algunos de los valores (por ejemplo, estableciendo STRING1 en algo diferente a "hello") y ve cómo afecta la salida.

Resumen

En este laboratorio, has aprendido cómo usar declaraciones condicionales en la programación de shell. Has practicado el uso de declaraciones 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 decisiones.

Puntos clave:

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

Recuerda, la práctica es la clave para dominar la programación de shell. Intenta crear tus propios scripts que utilicen estos conceptos de diferentes maneras. A medida que avances, encontrarás que estas declaraciones condicionales son esenciales para crear scripts más sofisticados y útiles.