Los nuevos ;&
y los ;;&
operadores se introdujeron en Bash
4.0
y, aunque ambos podrían ser útiles en situaciones similares, creo que no son de utilidad en su caso. Esto es lo que man bash
dice acerca de estos operadores:
Si el ;; se utiliza el operador, no se intentan coincidencias posteriores después de la primera coincidencia de patrón. Usando; & en lugar de ;; hace que la ejecución continúe con la lista asociada con el siguiente conjunto de patrones. Usando ;; & en lugar de ;; hace que el shell pruebe la siguiente lista de patrones en la instrucción, si la hay, y ejecute cualquier lista asociada en una coincidencia exitosa.
En otras palabras, ;&
es una caída a través y como la conocemos desde C
y
;;&
marcas bash
de verificación restantes casos en lugar de volver a
case
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í :
#!/usr/bin/env bash
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" "$0" | grep -v ':$')
cmd=$(echo "$cmd" | sed 's,;;,,')
cmd=$(echo "$cmd" | sed 's,esac,,')
eval "$cmd"
}
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
printf "perform fallthrough\n"
jumpto ft
else
printf "do not perform fallthrough\n"
fi
;;
*)
ft:
echo "fallthrough worked!"
;;
esac
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.