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 VAR
es 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 ]; then
parte 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
case
caí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
$var
primero 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
$input
si$var
es 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 elcase
y 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í).
case
no admite fallthrough sí mismo. Pero puede reemplazar*)
con&&
afteresac
para que respete los valores de retorno de otras ramas.fuente
Los nuevos
;&
y los;;&
operadores se introdujeron enBash
4.0 y, aunque ambos podrían ser útiles en situaciones similares, creo que no son de utilidad en su caso. Esto es lo queman bash
dice acerca de estos operadores:En otras palabras,
;&
es una caída a través y como la conocemos desdeC
y;;&
marcasbash
de verificación restantes casos en lugar de volver acase
bloquear 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
jumpto
funció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 porquejumpto
es el último comando en el mismo comando complejo que el bloque saltado.