Você precisa usar ;&
em vez de ;;
para obter um comportamento de fall-through:
#! /bin/bash
foo() {
case "$1" in
3)
echo "Level Three"
;&
2)
echo "Level Two"
;&
1)
echo "Level One"
;;
a)
echo "Level a"
;&
b)
echo "Level b"
;&
c)
echo "Level c"
;;
esac
}
echo 3:
foo 3
echo 2:
foo 2
echo a:
foo a
3:
Level Three
Level Two
Level one
2:
Level Two
Level one
a:
Level a
Level b
Level c
Consulte a seção Construções condicionais da documentação do bash.
O outro marcador especial é ;;&
, que:
causes the shell to test the patterns in the next clause, if any, and execute any associated command-list on a successful match.
;;
é sempre final, nenhum outro padrão é testado.
#! /bin/bash
foo() {
case "$1" in
*3*)
echo "Level Three"
;;&
*2*)
echo "Level Two"
;;&
*1*)
echo "Level One"
;;&
esac
}
echo 12:
foo 12
echo 13:
foo 13
echo 23:
foo 23
12:
Level Two
Level One
13:
Level Three
Level One
23:
Level Three
Level Two