Os novos operadores ;&
e ;;&
foram introduzidos em Bash
4,0
e embora ambos possam ser úteis em situações semelhantes, penso
eles não são úteis no seu caso. Isto é o que diz man bash
sobre
esses operadores:
If the ;; operator is used, no subsequent matches are attempted after
the first pattern match. Using ;& in place of ;; causes execution to
continue with the list associated with the next set of patterns. Using
;;& in place of ;; causes the shell to test the next pattern list in
the statement, if any, and execute any associated list on a successful
match.
Em outras palavras, ;&
é uma queda e como sabemos de C
e
;;&
faz bash
verificar os casos restantes em vez de retornar de
case
bloqueia completamente. Você pode encontrar um bom exemplo de ;;&
em ação
aqui: link .
Dito isto, nem ;&
nem ;;&
pode ser usado no seu script
porque ambos iriam para *)
que seria sempre executado.
O script a seguir funciona e faz o que você deseja sem reorganizar
a lógica, mas considerá-lo apenas como um exemplo e nunca confiar nele, é muito frágil.
Eu tirei a ideia de
aqui :
#!/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