Introducción
El case
de bash es la forma más simple de la declaración condicional if elif else. El case
declaración simplifica condiciones complejas con múltiples opciones diferentes. Esta declaración es más fácil de mantener y más legible que if
anidado declaraciones.
El case
prueba el valor de entrada hasta que encuentra el patrón correspondiente y ejecuta el comando vinculado a ese valor de entrada. Por lo tanto, es una excelente opción para crear menús donde los usuarios seleccionan una opción que activa la acción correspondiente.
En este tutorial, aprenderá el case
de bash declaración conceptos básicos y cómo usarlo en scripts de shell.
Requisitos previos
- Una máquina que ejecuta Linux.
- Acceso a la línea de comandos.
- Un editor de texto como vi/vim.
Sintaxis de declaración de caso bash
El case
de bash declaración toma la siguiente sintaxis:
case $variable in
pattern-1)
commands;;
pattern-2)
commands;;
pattern-3)
commands;;
pattern-N)
commands;;
*)
commands;;
esac
El case
la declaración comienza con el case
palabra clave seguida de $variable
y el in
palabra clave. La declaración termina con el case
palabra clave al revés - esac
.
$variable
- El script compara la entrada
$variable
contra los patrones en cada cláusula hasta que encuentre una coincidencia.
Patrones
- Un patrón y sus comandos forman una cláusula , que termina con
;;
. - Los patrones admiten caracteres especiales.
- El
)
operador termina una lista de patrones. - El
|
el operador separa varios patrones. - El script ejecuta los comandos correspondientes al primer patrón que coincide con la entrada
$variable
. - El asterisco
*
El símbolo define el caso predeterminado, generalmente en el patrón final.
Estado de salida
El script tiene dos estados de salida:
- 0 . El estado de retorno cuando la entrada no coincide con ningún patrón.
- Estado de comando ejecutado . Si el comando hace coincidir la variable de entrada con un patrón, se devuelve el estado de salida del comando ejecutado.
Ejemplos de declaración de caso Bash
Esta sección muestra ejemplos prácticos del uso de bash case
declaración.
Ejemplo 1:generar una descripción para cada opción
El siguiente ejemplo es un script que le permite al usuario elegir un color y muestra un comentario correspondiente a la entrada usando el comando echo.
Siga las instrucciones a continuación:
1. Abra la terminal (Ctrl + Alt + T ) y crea el script:
vi color.sh
2. Agregue las siguientes líneas al script:
#!/bin/bash
echo "Which color do you like best?"
echo "1 - Blue"
echo "2 - Red"
echo "3 - Yellow"
echo "4 - Green"
echo "5 - Orange"
read color;
case $color in
1) echo "Blue is a primary color.";;
2) echo "Red is a primary color.";;
3) echo "Yellow is a primary color.";;
4) echo "Green is a secondary color.";;
5) echo "Orange is a secondary color.";;
*) echo "This color is not available. Please choose a different one.";;
esac
Cada una de las líneas tiene el siguiente rol:
- La primera línea de cada guión suele ser el shebang (
#!
), que le indica al sistema operativo qué intérprete usar para analizar el archivo. - Las líneas 2-7 son el menú de opciones presentado al usuario para elegir.
- El
read color;
La variable solicita al usuario una respuesta y la almacena. - El
case
declaración contiene las posibles respuestas que corresponden a la entrada del usuario. En este ejemplo, la salida esecho
salida de comando. - La última línea,
esac
, finaliza elcase
declaración.
3. Guarde el script y salga de vi con el siguiente comando:
:wq
4. Antes de ejecutar cada script, asegúrese de modificarlo para que sea ejecutable:
chmod +x color.sh
5. Ejecute el script:
./color.sh
El script ofrece el menú de opciones y muestra un mensaje diferente según la opción seleccionada.
Ejemplo 2:uso de varios patrones
El case
declaración permite el uso de múltiples patrones en cada cláusula. Si la expresión coincide con los patrones especificados, el script ejecuta los comandos de esa cláusula.
Este script de ejemplo solicita al usuario que ingrese un mes y genera la cantidad de días. Hay tres respuestas posibles:
- 30 días.
- 31 días.
- 28 o 29 días para febrero.
Siga los pasos a continuación para crear el script:
1. Cree el script month.sh ejecutando:
vi month.sh
2. Introduzca las siguientes líneas y guarde el script:
#!/bin/bash
shopt -s nocasematch
echo "Enter the name of a month."
read month
case $month in
February)
echo "There are 28/29 days in $month.";;
April | June | September | November)
echo "There are 30 days in $month.";;
January | March | May | July | August | October | December)
echo "There are 31 days in $month.";;
*)
echo "Unknown month. Please check if you entered the correct month name: $month";;
esac
En el ejemplo anterior:
- La
shopt
comando con-s nocasematch
La opción reduce la posibilidad de error con la combinación de patrones que no distingue entre mayúsculas y minúsculas. - El símbolo de la pipa
|
separa los patrones en cada una de las cláusulas.
3. Haga que el script sea ejecutable:
chmod +x month.sh
4. Ejecute el script:
./month.sh
El script ignora las diferencias entre mayúsculas y minúsculas y genera el número correcto de días en el mes seleccionado.
Ejemplo 3:Bucles for
Usa un for
bucle en case
instrucciones cuando hay muchas expresiones para procesar. El siguiente script devuelve todos los tipos de archivos de un directorio.
Siga los pasos a continuación:
1. Cree el script de shell:
vi filelist.sh
2. Ingrese las siguientes líneas y luego guarde el script:
#!/bin/bash
for file in $(ls)
do
Extension=${file##*.}
case "$Extension" in
sh) echo "Shell script: $file";;
md) echo "A markdown file: $file";;
png) echo "PNG image file: $file";;
txt) echo "A text file: $file";;
zip) echo "An archive: $file";;
conf) echo "A configuration file: $file";;
py) echo "A Python script: $file";;
*) echo "Unknown file type: $file";;
esac
done
En el ejemplo anterior:
- Los ls El comando extrae una lista de archivos del directorio.
- El
for
loop aplica archivo globbing para extraer la extensión de cada archivo.
3. Haga que el script sea ejecutable:
chmod +x filelist.sh
4. Ejecute el script:
./filelist.sh
El script identifica cada tipo de archivo presente en el directorio actual.
Ejemplo 4:crear una libreta de direcciones
Usa el case
declaración para crear una base de datos simple y generar rápidamente la información solicitada. El siguiente ejemplo muestra el nombre, la dirección de correo electrónico y la dirección de la persona seleccionada:
1. Cree el guión:
vi phonebook.sh
2. Agregue las siguientes líneas y guarde el script:
#!/bin/bash
echo "Choose a contact to display information:"
echo "[C]hris Ramsey"
echo "[J]ames Gardner"
echo "[S]arah Snyder"
echo "[R]ose Armstrong"
read person
case "$person" in
"C" | "c" ) echo "Chris Ramsey"
echo "[email protected]"
echo "27 Railroad Dr. Bayside, NY";;
"J" | "j" ) echo "James Gardner"
echo "[email protected]"
echo "31 Green Street, Green Cove Springs, FL";;
"S" | "s") echo "Sarah Snyder"
echo "[email protected]"
echo "8059 N. Hartford Court, Syosset, NY";;
"R" | "r") echo "Rose Armstrong"
echo "[email protected]"
echo "49 Woodside St., Oak Forest, IL";;
*) echo "Contact doesn't exist.";;
esac
3. Cambie el script:
chmod +x phonebook.sh
3. Ejecute el script:
./phonebook.sh
El script genera los detalles de contacto de la persona seleccionada. Al seleccionar una opción que no aparece en la lista, se notifica al usuario que el contacto no existe.
Ejemplo 5:Comprobar tipo de carácter
El siguiente ejemplo muestra cómo usar el case
instrucción para verificar qué tipo de carácter ha ingresado el usuario.
Siga los pasos a continuación:
1. Cree el guión:
vi character.sh
2. Agregue las siguientes líneas y guarde el script:
#!/bin/bash
echo "Enter a character:"
read var
case $var in
[[:lower:]) echo "You entered a lowercase character.";;
[[:upper:]]) echo "You entered an uppercase character.";;
[0-9]) echo "You entered a digit.";;
?) echo "You entered a special character.";;
*) echo "You entered multiple characters.";;
esac
En el ejemplo anterior:
- El
$var
la variable de control almacena la entrada. - En lugar de escribir todas las combinaciones posibles para hacer coincidir, use los corchetes
[]
para denotar un rango de caracteres. Use corchetes dobles[[]]
para rangos POSIX.if-else
requiere ingresar cada condición de carácter individualmente. - El
?
carácter cubre caracteres que no son minúsculas, mayúsculas o dígitos. Sustituye solo un carácter, a diferencia de*
que reemplaza todo lo demás no cubierto por las condiciones anteriores.
3. Cambie los permisos para que el script sea ejecutable:
chmod +x character.sh
4. Ejecute el script:
./character.sh
El resultado indica el tipo de carácter ingresado después de compararlo con las condiciones especificadas.