Pode bash case statements cascade?

29

Estou tentando fazer algo assim:

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

onde, se $ level = 3, sairia

Level Three
Level Two
Level One

enquanto se $ level = 1, só seria produzido

Level One

Mas quando eu tento, recebo o erro syntax error near unexpected token ')' porque não incluí o ;; .

Todos os outros idiomas que eu conheço permitem isso, existe uma maneira de fazer isso em bash? Algum tipo de palavra-chave que significa "agora vá em frente e faça o próximo caso como se fosse compatível"?

    
por Benubird 10.05.2013 / 15:19

1 resposta

42

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
    
por 10.05.2013 / 15:27