Cómo utilizar el caso … Declaraciones esac en Bash

Contenidos

Bash Shell

En este tutorial, analizamos las declaraciones condicionales sustentadas 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 usando el case y esac modismos (un modismo es una palabra o un grupo de palabras, o una keyword, con patrones de uso establecidos; una forma de expresar un lenguaje informático), uno 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 disponen significados y operaciones similares.

Construyamos nuestro primero case .. esac declaración usando un script simple.

Un simple caso .. esac texto

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 posteriormente ejecutamos el propio script, cada vez pasando una opción distinto como entrada.

En nuestra cláusula de apertura de caso, especificamos que queremos utilizar la primera opción de entrada ($1) como variable a examinar. Nuestro case .. esac declaración verificará cada opción (como se indica en el texto que precede a una ) cláusula de cierre idiom) y posteriormente 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. El motivo de esto es simple; la sintaxis normal de Bash necesita 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. A pesar de esto, ¿qué pasa cuando pasamos algo más? En ese caso, queremos saltar a nuestro otro cláusula, indicada por un universal * idioma.

Un caso simple ... declaración esac en Bash

Vemos como pasamos 1 o 2 al script, se toma la acción correcta respectivo; Option was 1/2!. Además vemos cómo si hacemos otra cosa, el * El bloque de código se ejecuta correctamente, y además 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:

No pasar una variable a nuestro script de prueba también funciona debido a la cláusula * en nuestro caso .. declaración esac

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 debido a que al mismo tiempo se cumple un EOL (fin de línea)?

Terminación incorrecta del bloque de código en un caso Bash.

Tenga en cuenta que solo una terminación ; se utilizó en este script. Bash no lo posibilita y se produce un error; la sintaxis de terminación final de ;; es obligatorio, y algo a prestar atención al escribir case .. esac declaraciones

Por qué caso .. esac Y no si?

Además 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

Una alternativa a una sentencia case..esac usando una sentencia if..then..elif..else..fi

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 respuesta basada funcionará bien.

Una vez dicho esto, si y cuando la complejidad de la selección se torna 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 utilizar 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, a pesar de esto, esto además se puede hacer con Bash estándar if declaraciones, usando a modo de ejemplo el -a (y y -o (u) opciones de nuestra cláusula de prueba y especificando una cláusula de prueba secundaria. A modo de ejemplo, if [ "${1}" -eq 1 -o "${1}" -eq 3 ]; then ... Tenga en cuenta que aquí además usamos comparaciones numéricas en lugar de comparaciones sustentadas en texto como en nuestro ejemplo anterior.

Para obtener más información sobre if .. then .. else .. elif .. fi condicionales, además puede leer nuestro post 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

Un caso más complejo ... declaración esac en Bash con selectores adicionales

En esta circunstancia, hemos enumerado dos opciones posibles para cada bloque de código y las hemos separado por un | separador. Observe cómo funciona todo 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 factible 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 posteriormente el segundo case asegura que ya sea 2 o a se selecciona individualmente. Además 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 además se aplica a la terminación del anidado case .. esac, de nuevo con ;;, dicho de otra forma esac;;.

Terminando

En este tutorial, analizamos ejemplos prácticos de Bash basados case .. esac declaraciones. Además vimos dónde las declaraciones de casos son una mejor opción que las más tradicionales. if .. then .. fi declaraciones sustentadas.

Si Bash le interesa, puede hallar Primer: Bash Loops: for, while y hasta, Bash Process Termination Hacks y Cómo analizar correctamente los nombres de archivo en Bash.

¡Disfrutar!

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.