En el artículo anterior vimos cómo trabajar con declaraciones condicionales en bash para evaluar condiciones y tomar decisiones basadas en los resultados. Del mismo modo, en este artículo, aprenderemos a Declaración de caso en scripts bash, que también se utilizan para evaluar condiciones. Puede utilizar una declaración de caso de bash en lugar de escribir una lista larga de if..elif..else
Opinión. Si no tiene idea de las instrucciones condicionales, tenemos un artículo detallado sobre el tema. Te recomiendo que le eches un vistazo antes de leer este artículo.
Tabla de Contenidos
Sintaxis de la 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:
- La palabra clave
"case"
y"esac"
marca el principio y el final de la declaración del caso. - La palabra clave case debe ir seguida de una
"expression"
. Esta expresión se evalúa y la salida se busca utilizando la lista de muestra. - Después de la expresión
"in"
La palabra clave debe escribirse en eso. indica"value in patterns"
. - Puedes crear tantos patrones como quieras. Puedes pensar en cualquier patrón como uno
if
yelif
Cláusula en la declaración condicional. Si el valor evaluado de la expresión se compara con un patrón, este patrón ejecuta su bloque de código. El resto de patrones se omiten. - Cada instrucción dentro del patrón debe comenzar con a. ser completado punto y coma doble (
;;
). - Similar a la cláusula else en la instrucción if, hay un patrón estándar en la instrucción case llamado asterisco (
*
), que ejecuta su bloque de código si ninguno de los patrones coincide.
Ejemplo 1: calculadora con declaración de caso
En este ejemplo, he creado una calculadora simple con una declaración de caso. Déjame explicarte qué sucede cuando ejecutas este código.
- Se le solicita al usuario dos números que se almacenarán en variables
"X"
y"Y"
. - Se solicita al usuario el tipo de operación (sumar, restar, multiplicar, dividir) y almacenarlo en la variable «OPERADOR».
- En la declaración de caso, la variable «OPERADOR» es valorado y diferente plantilla (
+
,-
,x
,/
,%
) se crean para varias operaciones. - Cuando un patrón coincide, ese patrón ejecuta su declaración y omite todos los demás patrones en la declaración del caso.
- Si intenta ingresar valores distintos de los operadores aritméticos que desea, el valor predeterminado será plantilla (
*
) ejecuta su instrucció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
Echa un vistazo a la imagen de abajo, te enviaré el código y elegiré el «Operador de suma».
Estoy ejecutando el mismo código nuevamente, pero esta vez estoy dando un valor aleatorio que coincide con el patrón predeterminado (*
) ejecutar su instrucción.
Ejemplo 2: creación de varios patrones en una sola cláusula
En el ejemplo anterior, creamos diferentes patrones para diferentes operadores aritméticos. También es posible crear múltiples patrones en la misma cláusula, y si alguno de los patrones coincide, se ejecuta la instrucción correspondiente. La sintaxis es la misma, pero agrega un. adicional tubo Símbolo (|
) y agregue diferentes patrones en la misma línea que se muestra a continuación.
case expression in Pattern1 | Pattern2 | pattern3) STATEMENTS ;; *) STATEMENTS ;; esac
En el siguiente ejemplo, el usuario ingresa el año como entrada y recibe los detalles del límite naranja de los datos de la IPL. En 2015, 2017 y 2019 el mismo jugador ganó la gorra naranja, así que creé un año diferente como muestra 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: comparación de patrones en una declaración de caso
La coincidencia de patrones se puede utilizar 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])
Si el usuario ingresa un año después de 2021, se imprimirá un mensaje que dice «Serie pendiente».
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: confirmación de usuario recibida
A veces puede pedirle confirmación al usuario para pasar al siguiente paso de su programa. Usar una declaración de caso sería una buena opción para este caso de uso.
El ejemplo anterior escribe patrones en una línea e instrucciones en otra línea, pero también puede escribir patrones e instrucciones 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 que ejecutó anteriormente y realizar alguna acción utilizando declaraciones de casos. Estoy creando un cuadro de diálogo GUI para aceptar el nombre de usuario y la contraseña del usuario que está usando Cenit. Si el usuario envía correctamente el nombre de usuario y la contraseña, Zenity devolverá el código de retorno como cero y, en base a eso, agregué la lógica para agregar un nuevo usuario. Cualquier cosa que no sea cero resultará en 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
Yo presioné «Abortar» Botón en el cuadro de diálogo para que obtengo un error al usar el patrón predeterminado (*
).
Guiones de referencia
Para familiarizarse con las declaraciones de casos, puede mirar el código existente escrito con declaraciones de casos. Un mejor lugar para comenzar sería leer los scripts de inicio en /etc/init.d
Directorio. Por ejemplo, instalé Virtualbox en mi computadora y tiene un archivo de inicio en /etc/init.d
Directorio. Hay una sección de código escrita con una declaración de caso que da una buena idea de cómo funciona la declaración de caso.
$ cd /etc/init.d/
$ cat bluetooth
diploma
En este artículo, aprendimos sobre la declaración Case en Bash y las diferentes formas en que se puede usar. Tanto el enunciado condicional como el enunciado del caso tienen el mismo propósito. Debe tener una mejor comprensión de qué método es apropiado para el caso de uso. Las declaraciones de casos también se utilizan cuando necesita crear funciones de ayuda con getopt
y getopts
Programas. Cree un guión y practique los ejemplos que le dimos aquí para comprender más acerca de las declaraciones de casos.