GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Scripting – Declaración de caso

En el artículo anterior hemos visto cómo trabajar con sentencias condicionales en bash para evaluar condiciones y tomar decisiones en base a los resultados. De manera similar, en este artículo, aprenderemos a usar instrucción de caso en scripts Bash, que también se utiliza para evaluar condiciones. Puede usar una declaración de caso Bash en lugar de escribir una larga lista de if..elif..else declaración. Si no tiene idea acerca de las declaraciones condicionales, tenemos un artículo detallado sobre el tema. Le sugiero que le eche un vistazo antes de leer este artículo.

  • Secuencias de comandos de Bash:declaraciones condicionales

Sintaxis de declaración de caso

La sintaxis de la declaración de caso en bash se da a continuación:

case expression in
  pattern1) STATEMENTS ;;
  pattern2) STATEMENTS ;;
  Pattern3 | Pattern4 | pattern5) STATEMENTS ;;
  pattern-N) STATEMENTS ;;
  *) STATEMENTS ;;
esac

Explicación:

  1. La palabra clave "case" y "esac" marca el inicio y el final de la declaración del caso.
  2. El caso de la palabra clave debe ir seguido de una "expression" . Esta expresión se evaluará y la salida se buscará en la lista de patrones.
  3. Después de la expresión, "in" debe escribirse la palabra clave, que apunta a "value in patterns" .
  4. Puedes crear tantos patrones como quieras. Puedes pensar en cada patrón como un if y elif cláusula en la declaración condicional. Si el valor evaluado de la expresión se compara con un patrón, ese patrón ejecutará su bloque de código. Los patrones restantes se omitirán.
  5. Cada declaración dentro del patrón debe terminar con un doble punto y coma (;; ).
  6. Al igual que la cláusula else en la instrucción if, la instrucción case tiene un patrón predeterminado llamado asteriscos (* ) que ejecutará su bloque de código si ninguno de los patrones coincide.

Ejemplo 1 - Calculadora usando declaración de caso

En este ejemplo, he creado una calculadora simple usando una declaración de caso. Déjame explicarte lo que sucede cuando ejecutas este código.

  1. Se solicita al usuario que ingrese dos números y se almacena en variables "X" y "Y" .
  2. Se solicita al usuario que ingrese el tipo de operación (sumar, restar, multiplicar, dividir) y se almacena en la variable "OPERATOR" .
  3. En caso de declaración, la variable "OPERATOR" se evalúa y diferentes patrones (+ ,- ,x ,/ ,% ) se crean para diferentes operaciones.
  4. Si un patrón coincide, el patrón en particular ejecutará su declaración omitiendo todos los demás patrones en la declaración del caso.
  5. Si intenta introducir cualquier otro valor que no sean los operadores aritméticos deseados, el patrón predeterminado (* ) ejecutará su declaración.
#!/usr/bin/env bash

read -p "Enter the first number(X)  :  " X
read -p "Enter the second number(Y) :  " Y
read -p "
Addition => +
Subtract => -
Multiply => x
Division => /
Reminder => %

Choose any one operator   :  " OPERATOR
case "$OPERATOR" in
 +)
   echo -e "\nAddition of X and Y is $(( X + Y ))" ;;
 -)
   echo -e "\nSubtraction of X and Y is $(( X - Y ))" ;;
 x)
   echo -e "\nMultiply X and Y is $(( X * Y ))" ;;
 /)
   echo -e "\nDivision of X and Y is $(( X / Y ))" ;;
 %)
   echo -e "\nReminder of X and Y is $(( X % Y ))" ;;
 *)
   echo -e "\n[ERROR] You have chosen an operator that is not in the list.
You can choose either(+, -, x, /, %) operator from the list.
Rerun the program again."
esac

Eche un vistazo a la imagen de abajo, estoy enviando el código y eligiendo el "Operador de adición" .

Estoy ejecutando el mismo código nuevamente, pero esta vez dando un valor aleatorio que hará el patrón predeterminado (* ) ejecute su sentencia.

Ejemplo 2:creación de múltiples patrones en una sola cláusula

En el ejemplo anterior, hemos creado diferentes patrones para diferentes operadores aritméticos. También es posible crear varios patrones en la misma cláusula y, si alguno de los patrones coincide, se ejecutará la declaración en particular. La sintaxis será la misma pero agregará una tubería símbolo (| ) y agregue diferentes patrones en la misma línea como se muestra a continuación.

case expression in
   Pattern1 | Pattern2 | pattern3) 
   STATEMENTS ;;
   *)
   STATEMENTS ;;
esac

En el siguiente ejemplo, el usuario ingresará el año como entrada y obtendrá los detalles del límite naranja de los datos de IPL. En los años 2015, 2017 y 2019, el mismo jugador ganó la gorra naranja, por lo que he creado un año diferente según el patrón en la misma cláusula.

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Ejemplo 3 - Coincidencia de patrones en declaración de caso

Coincidencia de patrones puede usarse en declaraciones de casos. Estoy usando el mismo ejemplo de la sección anterior pero agregando un patrón adicional (20[2-9][2-9]) donde si el usuario ingresa cualquier año por encima de 2021, imprimirá un mensaje que dice "serie aún por suceder".

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 20[2-9][2-9])
   echo -e "\nSeries is yet to happen for the year $CAP" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Ejemplo 4:obtener la confirmación del usuario

A veces, puede solicitar al usuario que proporcione una confirmación para continuar con el siguiente paso en su programa. Usar una declaración de caso sería una buena opción para este caso de uso.

En el ejemplo anterior, el patrón se escribe en una línea y las declaraciones en otra línea, pero también puede escribir patrones y declaraciones en una sola línea como se muestra a continuación.

read -p "Input file is received in CSV format, Please confirm to load the data into production database  : " CONFIRM
case "$CONFIRM" in
 [Yy] | [Yy][Ee][Ss] ) echo "++ Running the utility to load the data to the database.." ;;
 [Nn] | [Nn][Oo] ) echo -e "++ Skipping load db step upon user confirmation..\n Exiting the script.." ;;
 *) echo -e "[ERROR] = Wrong Input, Exiting the script.."
esac

Ejemplo 5 - Declaración de caso con códigos de retorno

Puede escribir lógica para capturar el código de retorno del comando ejecutado anteriormente y realizar algunas acciones mediante declaraciones de casos. Estoy creando un cuadro de diálogo de GUI para aceptar el nombre de usuario y la contraseña del usuario que usa zenity . Si el usuario envía el nombre de usuario y la contraseña con éxito, zenity arrojará el código de retorno como cero y, en base a ello, he agregado lógica para agregar un nuevo usuario. Cualquier valor que no sea cero, se lanzará un mensaje de error.

INFO=$(zenity --password --username)
case $? in
 0)
   USERNAME=$(echo ${INFO} | awk -F "|" '{ print $1 }')
   PASSWORD=$(echo ${INFO} | awk -F "|" '{ print $2 }')
   useradd -m -p "${PASSWORD}" "${USERNAME}"
   ;;
 *)
   echo "[ERROR] - User not added."
esac

He pulsado el botón "Cancelar" en el cuadro de diálogo, por lo que me ha arrojado un error al usar el patrón predeterminado (* ).

Lectura sugerida:

  • Cómo crear cuadros de diálogo GUI en secuencias de comandos Bash con Zenity en Linux y Unix

Guiones de referencia

Para sentirse más cómodo con las declaraciones de casos, puede consultar los códigos existentes escritos con declaraciones de casos. Un mejor lugar para comenzar sería leer los scripts de inicio en /etc/init.d directorio. Por ejemplo, tengo virtualbox instalado en mi máquina y tiene un archivo de inicio en /etc/init.d directorio. Hay una sección de código que está escrita usando una declaración de caso que dará una buena idea de cómo funciona la declaración de caso.

$ cd /etc/init.d/
$ cat bluetooth

Conclusión

En este artículo, hemos visto qué es una declaración de caso en Bash y diferentes formas de usarla. Tanto la declaración condicional como la declaración de caso tienen el mismo propósito. Debería tener una mejor comprensión de qué método se ajusta al caso de uso. Las declaraciones de casos también se usarán cuando tenga que crear funciones de ayuda usando getopt y getopts programas Cree un guión y comience a practicar los ejemplos que hemos dado aquí para comprender más sobre las declaraciones de casos.

Guías de secuencias de comandos de Bash:

  • Secuencias de comandos de Bash:declaraciones condicionales
  • Bash Scripting:manipulación de cadenas
  • Secuencias de comandos de Bash:comando Printf explicado con ejemplos
  • Bash Scripting:matriz indexada explicada con ejemplos
  • Secuencias de comandos de Bash:matriz asociativa explicada con ejemplos
  • Secuencias de comandos de Bash:bucle For explicado con ejemplos
  • Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos
  • Redireccionamiento de Bash explicado con ejemplos
  • Secuencias de comandos de Bash:variables explicadas con ejemplos
  • Bash Scripting:funciones explicadas con ejemplos
  • Comando Bash Echo explicado con ejemplos en Linux
  • Tutorial de Bash Heredoc para principiantes

Linux
  1. Bash secuencias de comandos (I)

  2. ¿Mecanismo de bloques de declaraciones en secuencias de comandos de Shell?

  3. Uso de declaraciones de casos en Bash

  4. Declaración de Bash If-Else con ejemplos

  5. 5 ejemplos de declaraciones de casos Bash

Bash Scripting - Declaraciones condicionales

Bash Scripting – Manipulación de cadenas

Cómo trabajar con declaraciones de casos en scripts Bash

Script Bash (II)

Script Bash (III)

Sintaxis de Bash If Else con ejemplos