Os operadores new ;&
e ;;&
foram introduzidos na Bash
4.0
e, embora ambos possam ser úteis em situações semelhantes, acho que não são úteis no seu caso. É o que man bash
diz sobre esses operadores:
Se o ;; Se o operador for usado, nenhuma correspondência subsequente será tentada após a primeira correspondência de padrão. Usando; & no lugar de ;; faz com que a execução continue com a lista associada ao próximo conjunto de padrões. Usando ;; & no lugar de ;; faz com que o shell teste a próxima lista de padrões na instrução, se houver, e execute qualquer lista associada em uma correspondência bem-sucedida.
Em outras palavras, ;&
é uma queda através de e como a conhecemos a partir C
e
;;&
marcas bash
verificar restantes casos, em vez de retornar de
case
bloco inteiramente. Você pode encontrar um bom exemplo de ;;&
ação aqui: /programming//a/24544780/3691891 .
Dito isto, nem ;&
nem ;;&
poderia ser usado em seu script, porque os dois iriam para o *)
que sempre seriam executados.
O script a seguir funciona e faz o que você deseja sem reorganizar a lógica, mas considere-a apenas como um exemplo e nunca confie nela, é muito frágil. Eu peguei a ideia
daqui :
#!/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 do código para o que quer que esteja*)
? Porque isso é totalmente diferente do que é chamado de avanço, tornando a sua pergunta um pouco enganosa.