Estoy buscando una manera de que ocurra una falla basada en una condición if dentro de una condición de caso en bash. Por ejemplo:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
En el código anterior, si la variable VARes 1, me gustaría que la condición del caso se realizara de forma fallida.
bash
shell-script
case
Smashgen
fuente
fuente

if [ $VAR -eq 1 ]; thenparte del código a lo que sea que esté*)? Porque eso es completamente diferente de lo que se llama fallthrough, lo que hace que la formulación de su pregunta sea un poco engañosa.Respuestas:
No puedes La forma de tener una
casecaída es reemplazar el;;separador con;&(o;;&). Y es un error de sintaxis poner eso dentro de un if.Podría escribir toda la lógica como un condicional regular:
fuente
if.Sugeriría reestructurar su lógica: coloque el código "fallthrough" en una función en su lugar:
salidas
fuente
La siguiente secuencia de comandos convierte su prueba "de adentro hacia afuera" en el sentido de que
$varprimero probamos y luego realizamos el ensayo (usando;&en acase) dependiendo de$input.Hacemos esto porque la cuestión de si "realizar la falla" o no depende realmente de
$inputsi$vares así1. Si se trata de algún otro valor, la pregunta de si se debe hacer la falla ni siquiera tiene que hacerse.O sin
case:fuente
*). Ya tengo mi +1.No es algo que haría, pero podrías lograr algo que se acerque con:
fuente
Pruebe ambas variables a la vez (bash 4.0-alpha +):
En pruebas:
Limpio y sencillo.
Comprenda que el valor probado (
$new) debe tener solo dos valores posibles, es por eso que la cláusula if está ahí, para transformar VAR en un valor booleano. Si se puede hacer que VAR sea un booleano, pruebe0(no1) en elcasey quite elif.fuente
Puede hacer que el avance sea predeterminado, pero coloque una condición que el código solo se ejecuta si se cumple la condición
Pero como ilkkachu sugirió, también puedes usar condiciones en lugar de cambiar.
fuente
Si no le importa que alguien se queje de que no entiende su código, simplemente puede cambiar el orden de los dos condicionales:
O:
Simple y claro (al menos para mí).
caseno admite fallthrough sí mismo. Pero puede reemplazar*)con&&afteresacpara que respete los valores de retorno de otras ramas.fuente
Los nuevos
;&y los;;&operadores se introdujeron enBash4.0 y, aunque ambos podrían ser útiles en situaciones similares, creo que no son de utilidad en su caso. Esto es lo queman bashdice acerca de estos operadores:En otras palabras,
;&es una caída a través y como la conocemos desdeCy;;&marcasbashde verificación restantes casos en lugar de volver acasebloquear por completo. Puede encontrar un buen ejemplo de;;&en acción aquí: /programming//a/24544780/3691891 .Una vez dicho esto, ni
;&tampoco;;&se podría utilizar en el script porque ambos irían a*)que sería siempre funcionan.El siguiente script funciona y hace lo que quiere sin reorganizar la lógica, pero considérelo solo como un ejemplo y nunca confíe en él, es demasiado frágil. He tomado la idea de aquí :
fuente
jumptofunción y ejecuta lo que viene después. El hecho de que esto sea equivalente a continuar ejecutando después del bloque entreft:y;;es una coincidencia porquejumptoes el último comando en el mismo comando complejo que el bloque saltado.