En este tutorial, analizamos las declaraciones condicionales basadas en casos de Bash. Revisamos ejemplos prácticos y discutimos cuándo un caso Bash … la declaración esac se emplea mejor que una más tradicional if .. then .. fi declaración.
Caso Bash .. Declaraciones esac en Bash
Disponibles de forma nativa desde el shell Bash, sentencias condicionales de casos, formuladas utilizando el case y esac modismos (un modismo es una palabra o un grupo de palabras, o una palabra clave, con patrones de uso establecidos; una forma de expresar un lenguaje informático), se puede construir un condicional complejo caso por caso (de ahí el término case) búsqueda y declaración de ejecución por caso.
La parte de búsqueda de una declaración basada en un caso a veces se denomina Seleccione, lo que lleva al término declaración select / case (o al revés), utilizado en algunos otros lenguajes de codificación como VBA, para referirse al mismo tipo de paradigma de programación. Otro conjunto de lenguajes (como C #, C ++, Java y JavaScript) llaman a esto un cambiar o interruptor / caso declaración. Todos estos tienen significados y operaciones similares.
Construyamos nuestro primero case .. esac declaración usando un script simple.
Un simple caso .. esac guión
Definimos nuestro script de prueba test.sh como sigue:
#!/bin/bash case "${1}" in 1) echo "Option was 1!";; 2) echo "Option was 2!";; *) echo "Option was something else: '${1}'";; esac
A continuación, hacemos que nuestro script sea ejecutable ejecutando chmod +x test.sh y luego ejecutamos el propio script, cada vez pasando una opción diferente como entrada.
En nuestra cláusula de apertura de caso, especificamos que queremos usar la primera opción de entrada ($1) como variable a evaluar. Nuestro case .. esac declaración verificará cada opción (como se indica en el texto que precede a ) cláusula de cierre idiomático) y luego procesar el bloque de código (después de la ) idioma) para obtener el resultado correcto.
Tenga en cuenta que hay dos ; terminadores de fin de instrucción al final de cada línea. La razón de esto es simple; la sintaxis normal de Bash requiere que tengas al menos un modismo de terminación ; (a menos que ya esté al final de una línea), pero dentro del case .. esac declaración, necesitamos un adicional ; para indicar que estamos terminando un bloque de código para un bloque de ejecución de código de caso específico.
Podemos ver cómo hemos definido el código para ambos casos en los que 1 y 2 se pasan al script, respectivamente. Sin embargo, ¿qué pasa cuando pasamos algo más? En ese caso, queremos saltar a nuestro otro cláusula, indicada por un universal * idioma.
Pin it
Vemos como pasamos 1 o 2 al script, se toma la acción correcta correspondiente; Option was 1/2!. También vemos cómo si hacemos otra cosa, el * El bloque de código se ejecuta correctamente, y también se muestra nuestra primera variable pasada al script. ¿Qué pasaría si no pasáramos ninguna opción a nuestro script? los case .. esac el código aún sería evaluado, y dado que nada coincide excepto por nuestro catch-all * cláusula, esa se ejecuta:
Pin it
Entonces, ¿qué pasaría si asumiéramos, algo que puede parecer lógico, que podemos dejar un solo ; declaración del final de la línea de cada case .. esac cláusula simplemente porque al mismo tiempo se alcanza un EOL (fin de línea)?
Pin it
Tenga en cuenta que solo una terminación ; se utilizó en este script. Bash no lo permite y se produce un error; la sintaxis de terminación final de ;; es obligatorio y algo a tener en cuenta al escribir case .. esac declaraciones
Por qué caso .. esac Y no Si?
También podríamos escribir el código anterior usando un if declaración:
#!/bin/bash if [ "${1}"=="1" ]; then echo "Option was 1!" elif [ "${1}"=="2" ]; then echo "Option was 2!" else echo "Option was something else: '${1}'"; fi
Pin it
Esto parece comparable en calidad de código y brevedad en comparación con nuestro case .. esac código, y en las situaciones dadas y casos de uso específicos como estos, a menudo un if .. then .. elif .. else .. fi La solución basada funcionará bien.
Dicho esto, si y cuando la complejidad de la selección se vuelve más compleja o más grande, o si hay selecciones de casos de múltiples capas para realizar (tenga en cuenta que case .. esac se puede anidar), puede que valga la pena usar case .. esac declaraciones en su lugar.
Otra buena característica de case .. esac declaraciones es que uno puede enumerar dos opciones posibles para un solo bloque de ejecución de código, como veremos en nuestro siguiente ejemplo, sin embargo, esto también se puede hacer con Bash estándar if declaraciones, utilizando por ejemplo el -a (y y -o (u) opciones de nuestra cláusula de prueba y especificando una cláusula de prueba secundaria. Por ejemplo, if [ “${1}” -eq 1 -o “${1}” -eq 3 ]; then … Tenga en cuenta que aquí también usamos comparaciones numéricas en lugar de comparaciones basadas en texto como en nuestro ejemplo anterior.
Para obtener más información sobre if .. then .. else .. elif .. fi condicionales, también puede leer nuestro artículo Pruebas condicionales en Bash: if, then, else, elif.
Expandiendo nuestro caso
Ampliemos nuestro script anterior y hagamos nuestras condiciones un poco más complejas:
#!/bin/bash case "${1}" in 1|3) echo "Option was 1!" echo "Or, option was 3!";; 2|'a') case "${1}" in 2) echo "Option was 2!";; 'a') echo "Option was 'a'!";; esac;; *) echo "Option was something else: '${1}'";; esac
Pin it
En este caso, hemos enumerado dos opciones posibles para cada bloque de código y las hemos separado por un | separador. Note como todo funciona bien y las entradas 1 y 3 se analizan correctamente. En el segundo bloque de código, hemos creado un caso anidado y usamos cada entrada posible al segundo bloque de código (a saber 2 y a) como nuevas opciones en la esac anidada / secundaria.
Esto nuevamente funciona a la perfección. El flujo a través del código es que en el primer case declaración, la 2|’a’ se toma la rama es 2 o a se pasa, y luego el segundo case asegura que ya sea 2 o a se selecciona individualmente. También es de interés el uso de ;; cada vez que queremos terminar un bloque de código para una opción específica, y esto también se aplica a la terminación del anidado case .. esac, de nuevo con ;;, es decir esac;;.
Terminando
En este tutorial, analizamos ejemplos prácticos de Bash basados case .. esac declaraciones. También vimos dónde las declaraciones de casos son una mejor opción que las más tradicionales. if .. then .. fi declaraciones basadas.
Si Bash le interesa, puede encontrar Primer: Bash Loops: for, while y hasta, Bash Process Termination Hacks y Cómo analizar correctamente los nombres de archivo en Bash.
¡Disfrutar!