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.
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:
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)?
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
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
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!